假设两只青蛙一共跳了 \(t\) 次,那么可以得到
\[x+tm≡y+tn\ (mod\ \ \ l)\]
将这个式子拆开
\[(x+tm) \ \ \ mod \ \ \ l=(y+tn)\ \ \ mod\ \ \ l\]
可得
\[l|x+tm-y-tn\]
设\(\frac{x+tm-y-tn}{l}=r\)
可得
\[x+tm-y-tn=lr\]
合并一下同类项
\[t(m-n)+x-y=lr\]
移一下项
\[t(m-n)-lr=y-x\]
将两边都乘 \(-1\)
\[t(n-m)+lr=x-y\]
可以发现就是一个不定方程,拓展欧几里得求解即可。
拓展欧几里得够求解类如\(ax+by=c\)的不定方程,其中\(gcd(a,b)|c\),所以只要\((x-y)\ \ \ mod \ \ \ gcd(n-m,L)≠0\)就是无解的了。
#include <iostream>
#include <cstdio>
#include <algorithm>
typedef long long ll;
ll X, Y, N, M, L, T, R;
ll gcd(ll x, ll y)
{
return y ? gcd(y, x % y) : x;
}
void ex_gcd(ll a, ll b, ll c, ll &x, ll &y)
{
if(b == 0)
{
x = c / a;
y = 0;
return;
}
ex_gcd(b, a % b, c, y, x);
y = y - (a / b) * x;
}
int main()
{
scanf("%lld %lld %lld %lld %lld", &X, &Y, &M, &N, &L);
if(N < M)
{
std::swap(X, Y);
std::swap(N, M);
}
if((X - Y) % gcd(N - M, L))
{
puts("Impossible");
return 0;
}
ex_gcd(N - M, L, X - Y, T, R);
printf("%lld\n", (T % (L / gcd(N - M, L)) + (L / gcd(N - M, L))) % (L / gcd(N - M, L)));
return 0;
}