由题目可得式子:m*t-n* t=y-x+q * l - - -> (n-m)*t+q*l=x-y
令a=n-m,b=lc=x-y;
a*t+b*l=c 求最小的正t
令z=gcd(a,b)
先求a*t+b*q=z ① 当然如果c/z!=0就无解了
得出一组解t0,q0
两边同乘c/z
a* t0 * (c/z)+b * q0 *(c/z)=c
ans=(t%b/z+b/z)%b/z
#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
LL x,y,n,m,l;
LL e_gcd(LL a,LL b,LL &p,LL &q)
{
if(b==0)
{
p=1;
q=0;
return a;
}
LL r=e_gcd(b,a%b,p,q);
LL d=p;
p=q;
q=d-a/b*q;
return r;
}
int main()
{
LL p,q;
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
LL a=n-m,b=l,c=x-y;
if(a<0) a=-a,c=-c;//保证>0
LL z=e_gcd(a,b,p,q);
if(c%z==0)
{
int k=b/z;每隔b/z即b/gcd有一个解
printf("%lld
",((p*c/z)%k+k)%k);
}
else printf("Impossible
");
return 0;
}