90分求助,WA了最后一个点
查看原帖
90分求助,WA了最后一个点
1019606
KouMoSir楼主2024/2/27 18:58
#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;

请大佬看看错误在哪?

2024/2/27 18:58
加载中...