扩展欧几里得 解二元一次方程组

扩展欧几里得: 最大公约数 - OI Wiki (oi-wiki.org) 

int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    int tmp=x;
    x=y;
    y=tmp-(a/b)*y;
    return d;
}

P5656 【模板】二元一次不定方程 (exgcd) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
int a,b,x,y;
int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    int tmp=x;
    x=y;
    y=tmp-(a/b)*y;
    return d;
}
void solve(){
    int a,b,c; cin>>a>>b>>c;
    int d=exgcd(a,b,x,y);
    if(c%d) return cout<<-1<<'\n',void();
    x=x*c/d,y=y*c/d;
    int p=b/d,q=a/d,k;
    if(x<0) k=ceil((1.0-x)/p),x+=p*k,y-=q*k;
    else k=(x-1)/p,x-=p*k,y+=q*k;
    if(y>0)
        cout<<(y-1)/q+1<<' '<<x<<' '<<(y-1)%q+1<<' '<<x+(y-1)/q*p<<' '<<y<<'\n';
    else 
        cout<<x<<' '<<y+q*(int)ceil((1.0-y)/q)<<'\n';
}
signed main(){
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--)solve();
}

 

posted @ 2024-04-15 20:58  o-Sakurajimamai-o  阅读(5)  评论(0编辑  收藏  举报
-- --