• 欧几里德算法


    扩展欧几里德算法

    先介绍什么叫做欧几里德算法

        有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?

    gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了,这就是欧几里德算法,

      用 C++ 语言描述如下:

    int gcd(int a ,int b){
        if(b==0) return a;
        else return gcd(b,a%b);
    }

     

    为了介绍扩展欧几里得,我们先介绍一下贝祖定理:

    即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。

    换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。(可以来判断一个这样的式子有没有解)

    所以,扩展欧几里得

            当到达递归边界的时候,b==0,a=gcd(a,b) 这时可以观察出来这个式子的一个解:a*1+b*0=gcd(a,b),x=1,y=0,

    注意这时的a和b已经不是最开始的那个a和b了,所以我们如果想要求出解x和y,就要回到最开始的模样。

    int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法
    {
        if(b==0)
        {
            x=1;y=0;
            return a;  //到达递归边界开始向上一层返回
        }
        int r=exgcd(b,a%b,x,y);
        int temp=y;    //把x y变成上一层的
        y=x-(a/b)*y;
        x=temp;
        return r;     //得到a b的最大公因数
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13849163.html

  • 相关阅读:
    1372
    SPOJ
    HDU 3966-Aragorn's Story 树链剖分+树状数组
    LightOJ 1348
    HihoCoder 1568 不一定合法括号序列
    LightOJ 1343
    LightOJ 1266
    LightOJ 1112
    HihoCoder 1328 BFS 搜索
    链表交集、合并、排序
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13849163.html
Copyright © 2020-2023  润新知