欧几里得/拓展欧几里得
Posted donke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧几里得/拓展欧几里得相关的知识,希望对你有一定的参考价值。
最大公约数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,还没有验证
inline 表示是内联函数,就是在类内部展开,调用时没有入栈和出栈的过程,比较便捷
当一个函数需要经常使用,而且该函数的语句较少时,可以考虑使用内联函数
参考:inline用法详解
以上是关于欧几里得/拓展欧几里得的主要内容,如果未能解决你的问题,请参考以下文章