扩展欧几里得,exgcd(入门)

gcd(a,b)=gcd(b,a%b)
gcd(a,b)中要求a,b是非负数

//xa+yb=gcd
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);
    y-=a/b*x;
    return d;
}
ax+by=d通过exgcd求出了x0,y0(ax+by=gcd的解)后求出x和y的通解:
x=(x0-b/gcd)*k
y=(y0+a/gcd)*k

另类的方法(不常用,不实用)

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


全部评论

相关推荐

头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务