题解:主要是根据题目写出同余方程,(x+k * m)%L=(y+k*n)%L–>k *(m-n) ≡ y-x (mod L)—>k *(m-n)+ k1 *L=y-x;
我们令a=m-n,b=L,c=y-x(注意a,b要为正),使用拓展欧几里得即可求出解k;
但是要注意求的是x的最小整数解;
话不多说,上代码:
#include <iostream>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll r=exgcd(b,a%b,y,x);
y-=a/b*x;
return r;
}
int main()
{
ll x,y,m,n,l;
while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF)
{
ll a=m-n>0? m-n:n-m;///a,b都要大于0
ll c=m-n>0? y-x:x-y;
ll b=l;
ll r=exgcd(a,b,x,y);
if(c%r!=0) cout<<"Impossible"<<endl;
else
{
x=x*c/r;
ll t=b/r;
if(x>=0) ///(b/r>0)求最小整数解,由解的通式x=x0+k*(b/r)得最小整数解x<b/r
x=x%t; ///x0>0时,k=0,x=x0%(b/r)
else
x=x%t+t; ///x0<0时,x0%(b/r)<0,再加一个b/r就得到答案
cout<<x<<endl;
}
}
return 0;
}