zoukankan      html  css  js  c++  java
  • 欧几里得/拓展欧几里得

    最大公约数gcd()

    inline int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
    

    最小公倍数lcm()

    inline int lcm(int a,int b){return a/gcd(a,b)*b;}
    

    拓展欧几里得exgcd(int a,int b,int &x,int &y)

    作用:快速求整数x,y使得ax+by=gcd(a,b)

    对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然
    存在整数对 x,y ,使得 gcd(a,b)=ax+by。
    int exgcd(int a,int b,int &x,int &y){
        if (b==0){
            x=1,y=0;
            return a;
        }
        int q=exgcd(b,a%b,y,x);
        y-=a/b*x;
        return q;
    }///递归写法
    ///复制自百度
    
    int exgcd( int a,int b, int &x, int &y )
    {
        int r = a % b;
        int x0, y0, x1, y1;
        x0 = 1; y0 = 0;
        x1 = 0; y1 = 1;
        x = x1, y = y1;
        while( r )
        {
            x = x0 - a / b * x1;
            y = y0 - a / b * y1;
            x0 = x1;
            y0 = y1;
            x1 = x;
            y1 = y;
            a = b;
            b = r;
            r = a % b;
        }
        return b;
    }//循环写法
    //复制自简书
    //不太理解exgcd,还没有验证

     题目:virtual judge

    =============================

    欧几里得的几个定理:
    定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使 d = a*x+ b*y。

    定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。

    定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。

      证明:上述同余方程等价于ax + by = c,如果有解,两边同除以d,就有a/d * x + b/d * y = c/d,

      即a/d * x ≡ c/d (mod b/d),显然gcd(a/d, b/d) = 1,所以由定理二知道x在[0, b/d - 1]上有唯一解。

      所以ax + by = c的x在[0, b/d - 1]上有唯一解,即ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。

      如果得到ax ≡ c (mod b)的某一特解X,那么令m = b/gcd(a, b),可知x在[0, r-1]上有唯一解,

      所以用x = (X % m + m) %m就可以求出最小非负整数解x了!(X % m可能是负值,此时保持在[-(m-1), 0]内,

      正值则保持在[0, r-1]内。加上r就保持在[1, 2m-1]内,所以再模一下r就在[0, m-1]内了)。

      那么什么时候无解呢?仔细想想…….那就是: c=k*d =[ a*x+ b*y ]*k So 当c是d=gcd(a,b)的约数时候,就有唯一解!
    ---------------------
    原文:https://blog.csdn.net/u010579068/article/details/44681075

    =======================

    inline 表示是内联函数,就是在类内部展开,调用时没有入栈和出栈的过程,比较便捷

    当一个函数需要经常使用,而且该函数的语句较少时,可以考虑使用内联函数

    参考:inline用法详解  

  • 相关阅读:
    HBTC 2012 Hadoop与大数据技术大会演讲PPT资料
    DLINQ *.dbml文件该属于哪一层
    建立用户、密码类型
    关于VS2005网站发布问题的继续探讨
    MS SqlServer 2000交换排序的一种方法
    Socket多线程编程委托控件的奇怪问题
    .Net 3.5(LINQ,AJAX) Web简易聊天室 源码
    数据层的逻辑
    VS2005在开发Addin(外接程序)时自动生成的bug
    钩子注入
  • 原文地址:https://www.cnblogs.com/donke/p/10320945.html
Copyright © 2011-2022 走看看