POJ 1061 青蛙的约会
扩展欧几里得算法求解同余方程最小解
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 long long gcd(int a,int b){ 6 return b==0?a:gcd(b,a%b); 7 } 8 9 void exgcd(long long a,long long b,long long &d,long long &x,long long &y){ 10 if (!b){ 11 d=a; 12 x=1; 13 y=0; 14 return; 15 } 16 long long x1,y1; 17 exgcd(b,a%b,d,x1,y1); 18 x=y1; 19 y=x1-(a/b)*y1; 20 return ; 21 } 22 23 int main(){ 24 25 long long x,y,m,n,l; 26 scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l); 27 long long t,a; 28 long long d; 29 d=gcd(n-m,l); 30 exgcd(n-m,l,d,t,a); 31 t=t*(x-y)/d; 32 long long s=l/d; 33 t=(t%s+s)%s; 34 if ((x-y)%d==0) printf("%lld",t); 35 else printf("Impossible"); 36 return 0; 37 }