poj1062
扩展欧几里得,注意一些小细节。
在sa+tb=L(扩展a和b,s和t是扩展出来的可变的系数)中,如果a,b同时为0的话,无论L是不是0都无法用扩展欧几里得求出正确的答案,要另求;只要a和b至少有一个不为0,则就可以用扩展欧几里得求出正确的答案。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; void exgcd(long long int *a,long long int *b,long long int p,long long int l,long long int *d){ if(l==0){ *a=1; *b=1; *d=p; return; } else{ long long int a1,b1,d1; exgcd(&a1,&b1,l,p%l,&d1); *d=d1; *a=b1; *b=a1-p/l*b1; return; } } int main(){ long long int x,y,m,n,l; long long int a,b; long long int p,q; long long int d; scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l); x=x%l; y=y%l; if(m>n){ p=m-n; q=((y-x)%l+l)%l;//y-x写成了x-y } else{ p=n-m; q=((x-y)%l+l)%l;//x-y写成了y-x } exgcd(&a,&b,p,l,&d); if(q%d){ printf("Impossible\n"); } else{ a=a*q/d; if(a<0){ a=a+((-a)/(l/d)+1)*(l/d); } else if(a>0){ a=a%(l/d); } printf("%lld\n",a); } }