扩展欧几里得解不定方程

LL gcd(LL a,LL b){
    if(b==0) return a;
    else return gcd(b,a%b);
}

LL ex_gcd(LL a,LL b,LL &x,LL &y){
    if(b==0){
        x=1;y=0;
        return a;
    }
    LL r=ex_gcd(b,a%b,x,y);
    LL t=x;
    x=y;
    y=t-a/b*y;
    return r;
}

//求解ax+by=c的解x,y x,y需要提前定义
bool linear_equation(LL a,LL b,LL c,LL &x,LL &y)
{
    LL d=ex_gcd(a,b,x,y);
    if(c%d!=0)   //即不整除
        return false;
    LL k=c/d;
    x*=k; y*=k;    //求得的只是其中一组解,另外的解是:x+b/gcd(a,b)*i y-a/gcd(a,b)*i
    return true;
}

 

posted @ 2016-07-24 09:24  weeping  阅读(250)  评论(0编辑  收藏  举报