zoukankan      html  css  js  c++  java
  • 算法学习笔记1.2.2 扩展欧几里得

    任务

    求出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。

  • 相关阅读:
    GIt如何进行代码管理
    GIt如何安装使用
    selenium+xpath在不同层级的写法
    Java+Selenium 常见问题QA
    Java+Selenium如何解决空指针
    python 发邮件
    用apscheduler写python定时脚本
    http断点续传的原理
    好的代码是重构出来的
    python写excel总结
  • 原文地址:https://www.cnblogs.com/zifeiy/p/9520874.html
Copyright © 2011-2022 走看看