Noip2012同余方程
Description:
求关于x的同余方程a*x≡1(mod b)的最小正整数解。
Solution:
其实就是求最小正整数x使得a*x-1是b的倍数
不妨设它为b的-y倍 则a*x+b*y=1 欧几里得算法算出一个特解x0
然后处理一下x0使之称为满足题意的最小正整数就可以啦
Code:
View Code1 #include<iostream> 2 #include<cstdio> 3 #define Rg register 4 #define go(i,a,b) for(Rg int i=a;i<=b;i++) 5 #define yes(i,a,b) for(Rg int i=a;i>=b;i--) 6 using namespace std; 7 int read() 8 { 9 int x=0,y=1;char c=getchar(); 10 while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();} 11 while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();} 12 return x*y; 13 } 14 int exgcd(int a1,int b1,int &x1,int &y1) 15 { 16 if(!b1){x1=1;y1=0;return a1;} 17 int d=exgcd(b1,a1%b1,y1,x1); 18 y1-=a1/b1*x1;return d; 19 } 20 int a,b,x,y; 21 int main() 22 { 23 a=read();b=read(); 24 exgcd(a,b,x,y); 25 while(x<0)x+=b;//保证x是正整数 26 while(x-b>0)x-=b;//保证x是最小的 27 printf("%d",x); 28 return 0; 29 }
光伴随的阴影