社区讨论

救救孩子吧

P5656【模板】二元一次不定方程 (exgcd)参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m1qfd9h1
此快照首次捕获于
2024/10/01 20:38
去年
此快照最后确认于
2025/11/04 18:22
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
#define endl "\n"

using namespace std;

int t, a, b, c, x, y;

int exgcd(int a, int b)
{
    // if(a < b)
    // {
    //     swap(a, b);
    // }
    if(b == 0)
    {
        x = 1;  
        y = 0;
        return a;
    }
    int d = exgcd(b, a % b);
    int t = x;
    x = y;
    y = t - (a / b) * y;
    return d;
}

int ce(int p, int q)
{
    return (int)((p + q - 1) / q);
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> t;
    while(t--)
    {
        cin >> a >> b >> c;
        // gcd x0 y0
        // int gcd = exgcd(max(a, b), min(a, b));
        int gcd = exgcd(a, b);
        // cout << "   x == " << x << ", y == " << y << endl;
        if(c % gcd)  // 没有整数解
        {
            cout << -1 << endl;
            // cout << endl;
            continue;
        }
        // cout << "   gcd == " << gcd << endl;
        // x1 y1
        x *= (c / gcd);
        y *= (c / gcd);
        // cout << "   x == " << x << ", y == " << y << endl;
        // step
        int dx = b / gcd;
        int dy = (a / gcd);
        // min/maxr
        int l = ce((-x) / dx);
        int r = (int)(y / dy);
        if(l > r) // 没有正整数解
        {
            cout << x + l * dx << " " << y - r * dy << endl;
            // cout << endl;
            continue;
        }

        // 有正整数解
        int mxx = x + r * dx;
        int mxy = y - l * dy;
        int mnx = x + l * dx;
        int mny = y - r * dy;
        cout << (r - l + 1) << " " << mnx << " " << mny << " " << mxx << " " << mxy << endl;
        x = 0;
        y = 0;
        // cout << endl;
    }

    return 0;
}
样例没过

回复

0 条回复,欢迎继续交流。

正在加载回复...