solution:输入,a,b,m,n,l,则(a+mt)%l==(b+nt)%l时,他们相遇
不定方程:(n-m)x+ly=b-a。化为ax+by=c的形式,可以判断,若c%gcd(a,b)!=0则青蛙永远不能相遇
接下来用exgcd求出一组特解x0,y0。
部分摘自https://blog.youkuaiyun.com/u013377068/article/details/79748279
假设am + bn == gcd(a,b).
可以求出一个x满足此式子,然后由于c是gcd(a,b)的倍数,所以x=x*(c/gcd(a,b))
要求x是满足的最小正整数,则式子am + bn == c,可以变成
则扩展gcd求出来的一组特解x_0,y_0满足,k是常数
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll a, b, x, y, l, n, m;
ll exgcd(ll a, ll b) {
if(!b) {
x = 1, y = 0;
return a;
}
ll d = exgcd(b, a % b);
ll t = x;
x = y;
y = t - (a / b) * y;
return d;
}
int main() {
cin >> a >> b >> m >> n >> l;
ll c = a - b;
a = n - m, b = l;
ll gcd = exgcd(a, b);
if(c % gcd != 0) {
cout << "Impossible" << endl;
return 0;
}
x = (c / gcd) * x;
x %= (b / gcd);
if(x < 0)
x += (b / gcd);
cout << x;
return 0;
}