全部评论 1

  • 有了新的思路

    #include <iostream>
    using namespace std;
    typedef long long ll;
    const int N = 2e5 + 5;
    ll gcd(ll a, ll b){
        if(b == 0) return a;
        else return gcd(b, a % b);
    }
    bool exgcd(ll a, ll b, ll &x, ll &y, ll d){
        if(b == 0){
            if(d % a == 0){
                x = d / a;
                y = 0;
                return true;
            }
            return false;
        }
        ll x1, y1;
        bool res = exgcd(b, a % b, x1, y1, d);
        if(!res) return false;
        x = y1;
        y = x1 - a / b * y1;
        return true;
    }
    void solve(){
        ll a, b, c;
        cin >> a >> b >> c;
        ll d = gcd(a, b);
        ll x, y;
        bool res = exgcd(a, b, x, y, c);
        if(!res){
            cout << "-1\n";
            return ;
        }
        ll dx = b / d;
        ll dy = a / d;
        ll k = x % dx <= 0 ? x / dx - 1 : x / dx;
        ll xmin = x - k * dx;
        ll ymax = y + k * dy;
        k = y % dy <= 0 ? y / dy - 1 : y / dy;
        ll xmax = x + k * dx;
        ll ymin = y - k * dy;
        if(xmax <= 0 || ymax <= 0){
            // ll cnt = (xmax - xmin) / dx + 1;
            // cout << cnt << " " << xmin << " " << ymin << " " << xmax << " " << ymax << "\n";
            cout << xmin << " " << ymin << "\n";
            return ;
        }
        ll cnt = (xmax - xmin) / dx + 1;
        cout << cnt << " " << xmin << " " << ymin << " " << xmax << " " << ymax << "\n";
    }
    int main(){
        int t;
        cin >>t;
        while(t--) solve();
        return 0;
    }
    // gcd(a, b) = ax + by
    // = gcd(b, a % b) = bx1 + (a - a / b * b)y1
    // = ay1 + b(x1 - a / b * y1)
    

    2025-08-10 来自 上海

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页