我们设已经跳了 $t$ 次。
那么根据题意,我们可以知道青蛙 $A$ 所在的位置为 $(x+tm)\mod L$,青蛙 $B$ 所在的位置为 $(y+tn)\mod L$(这里是加而不是减的原因是题目说向西为正方向)。那么我们其实就是要找一个最小的非负整数 $t$,满足 $x+tm\equiv y+tn\space(\mod L)$。
那么移项可得 $(m-n)t\equiv y-x(\mod L)$。随后,用 exgcd 求解该线性同余方程即可。
感觉不能算困难题
代码如下:
#include<iostream>
#define int long long
using namespace std;
int x,y,m,n,L;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int z=x;
x=y;
y=z-y*(a/b);
return d;
}
signed main(){
cin>>x>>y>>m>>n>>L;
int a=((m-n)%L+L)%L,b=((y-x)%L+L)%L;
if(b%gcd(a,L)){
cout<<"Impossible";
return 0;
}
int X,Y;
exgcd(a,L,X,Y);
X=X*(b/gcd(a,L));
L=L/gcd(a,L);
X=(X%L+L)%L;
cout<<X;
return 0;
}