求ax+by=c不定方程板子

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

void solve(){
    //求解 ax+by =c 的不定方程
    int a,b,c;cin>>a>>b>>c;
    if(c%__gcd(a,b)){//无解
        cout<<-1<<endl;return;
    }
    int x0,y0;
    exgcd(x0,y0,a,b);
    int g=__gcd(a,b);

    x0*=c/g;
    y0*=c/g;
    int dx = b/g, dy=a/g;

    int dn = ceil((-x0+1)*1.0/dx);
    int up = floor((y0-1)*1.0/dy);

    if(dn>up){
        //无正整数解
        cout<<x0 +dn*dx<<' '<<y0 - up*dy<<endl;
    }else{
        //有正整数解
        cout<<(up-dn+1)<<' ';//解的个数
        cout<<(x0+dn*dx)<<' ';//x_min
        cout<<(y0-up*dy)<<' ';//y_min
        cout<<(x0+up*dx)<<' ';//x_max
        cout<<(y0-dn*dy)<<' ';//y_max
        cout<<endl;
    }

}
posted @ 2025-12-01 12:51  Marinaco  阅读(6)  评论(0)    收藏  举报
//雪花飘落效果