码迷,mamicode.com
首页 > 其他好文 > 详细

欧几里得/拓展欧几里得

时间:2019-01-25 18:47:17      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:virtual   get   int   epo   virt   百度   递归   blog   return   

最大公约数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

 

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

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

参考:inline用法详解  

欧几里得/拓展欧几里得

标签:virtual   get   int   epo   virt   百度   递归   blog   return   

原文地址:https://www.cnblogs.com/donke/p/10320945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!