• ACM数论之旅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) 这个公式

     1 #include<cstdio>
     2 typedef long long LL;
     3 void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d){
     4     if (!b) {d = a, x = 1, y = 0;}
     5     else{
     6         extend_Eulid(b, a % b, y, x, d);
     7         y -= x * (a / b);
     8     }
     9 }
    10 int main(){
    11     LL a, b, d, x, y;
    12     while(~scanf("%lld%lld", &a, &b)){
    13         extend_Eulid(a, b, x, y, d);
    14         printf("%lld*a + %lld*b = %lld
    ", x, y, d);
    15     }
    16 }

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

    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 } 

    连名字都简化了。。。

    ( •̀∀•́ )解完了

    睡觉~~~

  • 相关阅读:
    Zepto跨域请求
    C语言中浮点数的比较
    IOS开源项目Telegram初试
    Java NIO初试
    ios8.0之后注册通知中心
    spring AOP的配置
    IOS学习日记-2014年10月25日
    struct框架中实体类中属性的类型错误问题
    Oracle存储过程使用DML语句问题
    跳出类似framset 嵌入式框架
  • 原文地址:https://www.cnblogs.com/linyujun/p/5167916.html
Copyright © 2020-2023  润新知