典型的exgcd题目。 设走k步,首先由题目可得 (mk+x)%l=(nk+y)%l;由同余公式可得 (mk+x)%l-(nk+y)%l=0; ((mk+x)%l=(nk+y)%l)%l=0; 即mk-nk+x-y=ul【u为一整数】。 k(m-n)-ul=y-x。 把k看成x,n-m看成a,l看成b,u看成y即可求exgcd; 此题还要对最后结果去最小整数解,公式见代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define xx 10010
long l,x,y,m,n;
long xz,yz,r;
int exgcd(long a,long b)
{
if(b==0)
{
xz=1;
yz=0;
return a;
}
r=exgcd(b,a%b);
long u=xz;
xz=yz;
yz=u-(a/b)*yz;
return r;
}
int main()
{
cin>>x>>y>>m>>n>>l;
long az=n-m,bz=l;
long a=x-y;
if(az<0)//负数处理。
{
az=-az;
a=-a;
}
exgcd(az,bz);
if(a%r!=0)
cout<<"Impossible";
else
cout<<((xz*(a/r))%(l/r)+(l/r))%(l/r);
//有特殊解得最小解的公式。
return 0;
}