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)则青蛙永远不能相遇
接下来用exgcd求出一组特解x0,y0。
假设am + bn == gcd(a,b).
当c % gcd(a,b) == 0 时有解,令 k * gcd(a,b) == c;
=> k*a*m + k*b*n == k*gcd(a,b);
=>x == k*m == c*m/gcd(a,b) , y == k*n == c*n/gcd(a,b) ;
设 X0 ,Y0 是 a*x + by 的某一特解。则 该不定方程的通解为
X = X0 - b/gcd(a,b)*t;
Y = Y0 + a/gcd(a,b)*t; t为任意一个整数
X = (c*M0 - b*t)/gcd(a,b);
Y = (c*N0 + a*t)/gcd(a,b);
求出a*x + b*y ==c 的通解为 X = (c*x0 - b*t)/gcd(a,b); Y = (c*y0 + a*t)/gcd(a,b);
则最小整数解为:x=(c*x0)/gcd(a,b)
#include <bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define ll long long
#define ld long double
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define lcm(a,b) ((a)*(b)/(__gcd((a),(b))))
//#define mod 100003
#define MP make_pair
#define PI pair<int,int>
using namespace std;
const int N = 1e6 + 10;
const int MOD = 1e9 + 7;
ll x, y, m, n, l, t, a, b;
ll exgcd(ll a, ll b) {
if (b == 0) {
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 r = exgcd(m - n, l);//r是最大公约数
if((b - a) % r) {
cout << "Impossible";
return 0;
}
x = (x * ((b - a) / r) % l / r + l / r) % l / r;//最小非负数解
cout << x;
return 0;
}