#include <iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const ll N = 1e5 + 10;
ll x, y, m, n, l;
ll g, f;
void exgcd(ll a, ll b, ll& x, ll& y) {
if (b == 0) {
x = f / g, y = 0;
return;
}
exgcd(b, a % b, x, y);
ll tmp = x;
x = y;
y = tmp - a / b * y;
}
ll gcd(ll x, ll y) {
if (x < y)swap(x, y);
if (x % y == 0)return y;
else return gcd(y, x % y);
}
int main()
{
cin >> x >> y >> m >> n >> l;
ll tmpx, tmpy;
if (n < m) {
swap(n, m);
swap(x, y);
}
f = ((x - y) % l + l) % l;
g = gcd(n- m, l);
if (f % g != 0) {
cout << "Impossible\n";
return 0;
}
exgcd(n - m, l, tmpx, tmpy);
tmpx = (tmpx % l + l) % l;
cout << tmpx << '\n';
}
我的想法是,保证n-m是正数
然后x-y可以通过加减l来保证是正数
(x-y)+k * l = tmpx*(n-m)+tmpy * l +k * l
我在程序中使用变量f代替(x-y)+k* l
这里我们求解的是tmpx,k*l不会影响到tmpx
然后在exgcd递归到b=0的时候
等式应该变成:
f = tmpx * g + 0
其中g是(n-m)和l的最大公倍数
所以递归的底部tmpx = f/g,tmpy =0;
请大佬看看错误在哪?