extended euclidean algorithm 双六问题 2018-2-10

using namespace std;  
int ex_Gcd(int a,int b,int &x,int &y){  
    if(b == 0){  
        x = 1;  
        y = 0;  
        return a;  
    }  
    else{  
        int r = ex_Gcd(b,a%b,x,y);  
        int t = x;  
        x = y;  
        y = t - (a/b)*y;  
        return r;  
    }  
}  
int main(){  
    int a,b,x,y;  
    while(scanf("%d%d",&a,&b)!=EOF){  
        if(ex_Gcd(a,b,x,y)!=1)  
            printf("0\n");  
        else  
            printf("%d\n",abs(x)+abs(y));  
    }  
    return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
扩展欧几里得算法(Extended Euclidean algorithm)是一种用于求解两个数的最大公约数(GCD)以及相应的贝祖等式(Bézout's identity)的算法。它可以用于求解某个数在模意义下的逆元,以及求解线性同余方程等问题。 扩展欧几里得算法的基本思想是通过不断地进行辗转相除来求解两个数的最大公约数,同时维护一些额外的变量来表示最大公约数的系数。具体来说,我们从两个数a和b开始,用b去除a并得到余数r1,然后用a去除r1并得到余数r2,以此类推,直到余数为0为止。最后一步的除数即为最大公约数。 在辗转相除的过程中,我们可以通过维护两个系数s和t来表示最大公约数的线性组合,即GCD(a, b) = s * a + t * b。初始时,我们令s=1,t=0(因为a和b的最大公约数为a本身时,s=1,t=0),在每一次辗转相除的过程中,我们更新系数s和t的值,直到余数为0为止。最后得到的系数s和t即为最大公约数的线性组合。 下面是扩展欧几里得算法的伪代码: ``` function extended_gcd(a, b): if b == 0: return (a, 1, 0) else: d, s, t = extended_gcd(b, a % b) return (d, t, s - (a // b) * t) ``` 在函数调用结束后,返回的三个值中,第一个值为a和b的最大公约数,第二个值为最大公约数的系数s,第三个值为最大公约数的系数t。 例如,我们要求解a=35和b=15的最大公约数以及其系数。根据上述算法的伪代码,我们可以执行以下操作: ``` d, s, t = extended_gcd(35, 15) print(d, s, t) ``` 输出结果为:5 1 -2。因此,35和15的最大公约数为5,其系数s为1,系数t为-2。即5 = 1 * 35 - 2 * 15。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值