这个主要是按照公式来,然后数很接近int 的边界了,随手long long~
A 青蛙 (x+m*t)%l
B 青蛙 (y+n*t)%l
(x+m*t)%l = (y+n*t)%l
—-> (m-n)*t+kl=y-x;
然后用通项求出最小解
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
#define LL long long
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b){
x=1;y=0;d=a;
}
else {
exgcd(b,a%b,d,y,x);
y-=(a/b)*x;
}
}
int main()
{
LL x,y,m,n,l;
while(scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&l)!=EOF){
LL z=(y-x+l)%l;
m=(m-n+l)%l;
LL k,t,d;
exgcd(m,l,d,t,k);
if(z%d) printf("Impossible\n");
else {
t=(t%l+l)%l;
m=m/d,l=l/d;
while(t>0) t=t-l;
while(t<0) t=t+l;
printf("%lld\n",t*(z/d)%l);
}
}
return 0;
}