拿了以前在pojAC的代码一交,WA了。。。
重写了、
根据题意有
p+m*k=q+n*k (mod L)
化简
p-q+(m-n)k=(k')*L
再化简
(m-n)*k+k'*(-L)=q-p
另a=m-n,b=-L
a*k+b*k'=q-p
这就可以用扩展欧几里德了
#include<iostream> #include<algorithm> using namespace std; long long x,y; long long extended_gcd(long long a,long long b) { long long t,gcd; if(b==0) { x=1; y=0; return a; } gcd=extended_gcd(b,a%b); t=x; x=y; y=t-a/b*y; return gcd; } int main() { long long p,q,m,n,l; while(~scanf("%lld %lld %lld %lld %lld",&p,&q,&m,&n,&l)) { long long a=m-n; long long b=-1*l; long long d=extended_gcd(a,b);//求出d公约数,同时求出(a/d)*k+(b/d)*k'=1的一组解 if((q-p)%d!=0) { printf("Impossible\n"); continue; } long long k=x*(q-p)/d;//获得k的一个解 //k的通解为k+b/d*n n为1,2,3,, k%=(b/d); if(b/d>0) { while(k<0) { k+=b/d; } } if(b/d<0) { while(k<0) { k-=b/d; } } printf("%lld\n",k); } return 0; }