标签:lfloor right GCD rfloor int gcd 笔记 exGCD left
GCD
int do_gcd(int p,int q){
if(!q)return p;
else return do_gcd(q,p%q);
}
Time: \(O(logn)\)
- 有一个定理:\(lcm(a,b)*gcd(a,b)=a*b\),求完gcd后可以Time:\(O(1)\)求lcm
Ex_GCD (恶心gcd)
过程
由裴蜀定理得 \(ax+by=c\) ,当c是gcd(a,b)的倍数的时候,才能有解
那么从基础的地方开始:如何求 \(ax+by=gcd(a,b)\) ? 因为解决完这个问题后, 答案再乘上 \(a/\gcd(a,b)\) 就行了
解法:(来源于oi-wiki )
\(a x_{1}+b y_{1}=\operatorname{gcd}(a, b)\)
\(b x_{2}+(a \bmod b) y_{2}=\operatorname{gcd}(b, a \bmod b)\)
由欧几里得定理可知: \(\quad \operatorname{gcd}(a, b)=\operatorname{gcd}(b, a \bmod b)\)
所以 \(a x_{1}+b y_{1}=b x_{2}+(a \bmod b) y_{2}\)
又因为 \(a \bmod b=a-\left(\left\lfloor\frac{a}{b}\right\rfloor \times b\right)\)
所以 \(a x_{1}+b y_{1}=b x_{2}+\left(a-\left(\left\lfloor\frac{a}{b}\right\rfloor \times b\right)\right) y_{2}\)
\(a x_{1}+b y_{1}=a y_{2}+b x_{2}-\left\lfloor\frac{a}{b}\right\rfloor \times b y_{2}=a y_{2}+b\left(x_{2}-\left\lfloor\frac{a}{b}\right\rfloor y_{2}\right)\)
因为 \(a=a, b=b,\) 所以 \(x_{1}=y_{2}, y_{1}=x_{2}-\left\lfloor\frac{a}{b}\right\rfloor y_{2}\)
将 \(x_{2}, y_{2}\) 不断代入递归求解直至 gcd (最大公约数, 下同) 为 \(0\) 递归 \(x=1, y=0\) 回去求解。
- 结论:两个式子可以得出 \(x_{1}=y_{2}, y_{1}=x_{2}-\left\lfloor\frac{a}{b}\right\rfloor y_{2}\) 直到\(x=1,y=0\)时返回0
代码
void exgcd(int p,int q,int &x,int &y){
if(!q){x=1,y=0;return ;}
exgcd(q,p%q,x,y);
int tmp=x;
x=y,y=tmp-(p/q)*y;
return z;
}
Time:\(O(logn)\) ( 因为p和q和gcd复杂度是一样的,而终止条件也是p=0 )
用递归做可以让常数稍微减少,但问题不大就懒得写了qwq
标签:lfloor,right,GCD,rfloor,int,gcd,笔记,exGCD,left 来源: https://www.cnblogs.com/BlankAo/p/14018195.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。