洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]

P1082 同余方程

题目描述

求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。

输入输出格式

输入格式:

输入只有一行,包含两个正整数 a, b,用一个空格隔开。

输出格式:

输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

输入输出样例

输入样例#1:
3 10
输出样例#1:
7

说明

【数据范围】

对于 40%的数据,2 ≤b≤ 1,000;

对于 60%的数据,2 ≤b≤ 50,000,000;

对于 100%的数据,2 ≤a, b≤ 2,000,000,000。

NOIP 2012 提高组 第二天 第一题

 

ax≡1(%b)  等价于 ax + by = 1

因为ax % b = 1 % b = 1

即ax = -yb + 1(别忘了y取正负都可以)

裸扩展欧几里得

算出来可能x为负数,只需要多加b然后%b即可

即答案为:((x % b) + b) % b

 

 1 #include <bits/stdc++.h>
 2 const int INF = 0x3f3f3f3f;
 3 inline void read(int &x)
 4 {
 5     x = 0;char ch = getchar();char c = ch;
 6     while(ch < '0' || ch > '9')c = ch, ch = getchar();
 7     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0',ch = getchar();
 8     if(c == '-')x = -x;
 9 }
10 void exgcd(int a,int b,int &x,int &y)
11 {
12     if(!b){x = 1;y = 0;}
13     else 
14     {
15         exgcd(b, a%b, y, x);
16         y -= a/b * x;
17     }
18 }
19 
20 int a,b;
21 
22 int main()
23 {
24     read(a);read(b);
25     int x = 0,y = 0;
26     exgcd(a, b, x, y);
27     printf("%d", ((x%b) + b)%b);
28     return 0;
29 }

 

 

posted @ 2017-06-11 16:48  嘒彼小星  阅读(174)  评论(0编辑  收藏  举报