洛谷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 }