题目描述
求关于x的同余方程ax≡1(modb) 的最小正整数解。
输入输出格式
输入格式:
一行,包含两个正整数 a,b,用一个空格隔开。
输出格式:
一个正整数 x_0,即最小正整数解。输入数据保证一定有解。
输入输出样例
说明
【数据范围】
对于 40%的数据,2 ≤b≤ 1,000;
对于 60%的数据,2 ≤b≤ 50,000,000;
对于 100%的数据,2 ≤a, b≤ 2,000,000,000。
NOIP 2012 提高组 第二天 第一题
分析:
本题从数据规模和题目描述上看就知道是数论题,而问题不难转换成求ax-by=1(y是整数)的解,所以最后再用扩欧乱搞一下就行了。。。
CODE:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 const int M=10005; 6 int a,b,now; 7 int s[M],t[M],q[M]; 8 int main(){ 9 cin>>a>>b; 10 int bb=b; 11 //if (a>b) swap(a,b); 12 s[0]=t[1]=1; 13 s[1]=t[0]=0; 14 now=1; 15 while (b){ 16 q[now]=a/b; 17 swap(a,b); 18 b%=a; 19 now++; 20 s[now]=s[now-2]-q[now-1]*s[now-1]; 21 t[now]=t[now-2]-q[now-1]*t[now-1]; 22 } 23 while (s[now-1]<=0) s[now-1]+=bb; 24 cout<<s[now-1]<<endl; 25 //system("pause"); 26 return 0; 27 }