由题意得
(x+mt)%L = (y+nt)%L → [(x-y)+t(m-n)]%L = 0 → (x-y)+t(m-n) = Lp → Lp+(n-m)t = x-y
最终得到(n-m)t = (x-y)%L
该式形如ax=c%b
直接应用扩欧
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<string>
#define MAX 1000000007
#define LL long long
using namespace std;
LL xx,yy,x,y,m,n,l;
LL egcd(LL a,LL b,LL &xx,LL &yy)
{
LL tmp,r;
if(!b)
{
xx=1;
yy=0;
return a;
}
r=egcd(b,a%b,xx,yy);
tmp=xx;
xx=yy;
yy=tmp-(a/b)*yy;
return r;
}
int main()
{
LL a,b,c,z,t;
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
a=n-m;
b=l;
c=x-y;
if(a<0) a=-a,c=-c;
z=egcd(a,b,xx,yy);
if(c%z)
{
printf("Impossible");
return 0;
}
t=b/z;
xx=(c/z*xx%t+t)%t;
printf("%lld",xx);
return 0;
}