zoukankan      html  css  js  c++  java
  • 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 } 

    连名字都简化了。。。

    ( •̀∀•́ )解完了

    睡觉~~~

  • 相关阅读:
    506Relative Ranks(LeetCode)
    计算二进制中1的个数
    vector<vector<int>> 简单知识介绍
    167. Two Sum II
    561. Array Partition I(LeetCode)
    sizeof 用法部分总结
    530. Minimum Absolute Difference in BST(LeetCode)
    JS计算两个日期之间的天数
    路演会上会登记结论的委员信息页面
    eclipse安装SVN插件
  • 原文地址:https://www.cnblogs.com/linyujun/p/5167916.html
Copyright © 2011-2022 走看看