任务

求出A,B的最大公约数,且求出X,Y满足AX + BY = GCD(A, B)。

说明

要求X,Y,满足:

  • AX + BY = GCD(A,B)。

当 B = 0 时,有X=1,Y=0时等式成立。
当 B > 0 时,在欧几里得算法的基础上,已知:

  • GCD(A,B) = GCD(B, A mod B)

先递归求出 X',Y' 满足:

  • BX' + (A mod B)Y' = GCD(B, A mod B) = GCD(A, B)

然后可以回推,我们将上式化简得:

  • BX' + (A - A/B x B)Y' = GCD(A, B)
  • AY' + BX' - (A/B) x BY' = GCD(A, B)

这里除法指整除。把含B的因式提取一个B,可得:

  • AY' + B(X' - A/B x Y') = GCD(A, B)

故 X=Y', Y= X' - A/B x Y'。

接口

int extend_gcd(int a, int b, int &x, int &y);

复杂度:O(logN), 其中N和a,b同阶。
输入:

  • a,b 两个整数
  • &x, &y 引用,ax + by = GCD(a,b)的一组解

输出:a和b的最大公约数
调用后x,y满足方程ax+by=GCD(a,b)。

代码

int extend_gcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    } else {
        int r = extend_gcd(b, a%b, y, x);
        y -= x * (a / b);
        return r;
    }
}

使用范例

POJ1006,POJ2115。

相关文章:

  • 2021-06-01
  • 2021-06-14
  • 2021-07-31
  • 2021-08-12
猜你喜欢
  • 2022-01-13
  • 2021-10-03
  • 2022-12-23
  • 2021-06-13
  • 2021-10-18
  • 2021-05-27
  • 2022-02-15
相关资源
相似解决方案