zoukankan      html  css  js  c++  java
  • 数论4——扩展欧几里得算法

    度娘百科说:

    首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •̀∀•́ )她说根据数论中的相关定理可以证明,反正我信了)

    所以 ax+by = gcd(a, b) * k 也肯定有解 (废话,把x和y乘k倍就好了)

    所以,这个公式我们写作ax+by = d,(gcd(a, b) | d)

    gcd(a, b) | d,表示d能整除gcd,这个符号在数学上经常见

    那么已知 a,b 求 一组解 x,y 满足 ax+by = gcd(a, b) 这个公式

    #include<cstdio>
    typedef long long LL;
    void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d){
        if (!b) {d = a, x = 1, y = 0;}
        else{
            extend_Eulid(b, a % b, y, x, d);
            y -= x * (a / b);
        }
    }
    int main(){
        LL a, b, d, x, y;
        while(~scanf("%lld%lld", &a, &b)){
            extend_Eulid(a, b, x, y, d);
            printf("%lld*a + %lld*b = %lld
    ", x, y, d);
        }
    }
    

    有些人喜欢极度简化,这是病,得治(,,• ₃ •,,)比如在下

    1 void ex_gcd(LL a, LL b, LL &d, LL &x, LL &y){
    2     if(!b){d = a; x = 1; y = 0;}
    3     else{ex_gcd(b, a%b, d, y, x); y -= x*(a/b);}
    4 } 
    View Code

    连名字都简化了。。。

    ( •̀∀•́ )解完了

  • 相关阅读:
    js读取解析json数据
    dot.js简单入门
    免费API接口整理
    综合方式输出通信数据
    redis常用
    数据库主从复制
    数据库存储过程
    数据库触发器
    局域网访问本地wampserver调试环境
    远程数据同步工具cwRsync
  • 原文地址:https://www.cnblogs.com/xzxl/p/7353844.html
Copyright © 2011-2022 走看看