线性同余方程
设两只青蛙跳了t步,那么当他们相遇时满足
x+mt−y−nt=kl∗(k∈Z)
。
即
(n−m)t+kl=x−y
。
设n-m=A,x-y-B,那么题目即转化为对于同余方程
At≡B( mod l)
,求最小的正整数解t。
然后就可以用扩展欧几里得解决了。
设
M=l/gcd(a,l)
,
如果
B mod exgcd(A,l)≠0
或者
m=n
则无解,否则答案为
((B/gcd(A,l)) mod M)+M) mod M
。
注意如果m>n是要交换的(别问我为什么)
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL x,y,m,n,l;
LL exgcd(LL a,LL &x,LL b,LL &y){
if (b==0){
x=1; y=0; return a;
}
LL ret=exgcd(b,x,a%b,y);
LL t=x; x=y; y=t-a/b*y;
return ret;
}
int main(){
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
LL p,q; if (n<m){
swap(n,m); swap(x,y);
}
LL t=exgcd(n-m,p,l,q);
if ((x-y)%t||m==n){
printf("Impossible\n");
return 0;
}
LL MOD=l/t;
p=(p*((x-y)/t))%MOD;
printf("%lld\n",(p+MOD)%MOD);
return 0;
}