扩展欧几里得学习笔记

简述Exgcd

要求关于\(x,y\)的方程\(ax+by=c\)的一组解。

假装显然我们要先求出\(ax+by=\mathrm{gcd}(a,b)\)的一组解,然后就可以找出所有的解\(x,y\)

\(bx'+(a\%b)y'=\mathrm{gcd}(b,a\%b)=\mathrm{gcd}(a,b)\)

\(\because a \% b = a - \left\lfloor\frac{a}{b}\right\rfloor \times b\)

\(\therefore bx' + (a \% b) y' = bx' + (a - \left\lfloor\frac{a}{b}\right\rfloor \times b) y’\)

\(\quad = bx' + ay' - \left\lfloor\frac{a}{b}\right\rfloor \times by’ = ay' + b (x' - \left\lfloor\frac{a}{b}\right\rfloor \times y')\)

故有:
\[ \mathrm{Exgcd}(a,b)=\left\{ \begin{array}{} x = 1,\; y = 1 & \mathrm{if}\;b=0\\ \mathrm{Exgcd}(b,a \% b),\; y = x - \left\lfloor\frac{a}{b}\right\rfloor\times y & \mathrm{if} \; b \not = 0 \end{array} \right. \]

代码

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

转载于:https://www.cnblogs.com/zhylj/p/9571264.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值