扩展欧几里得算法:
1.扩展欧几里得算法可以求逆元
2.扩展欧几里得算法可以求类似 ax+by=m, 的所有整数解,当m%gcd(a,b)==0 则ax+by=m有无线多个解,否则无解
扩展欧几里得的基础式 ax+by=gcd(a,b) 下面会用到这个式子
下面我会给出这个基础式的模板
扩展欧几里得算法求逆元:
刚开始值知道这个算法可以求解逆元,
逆元的定义:ax1(mod b) (注意gcd(a,b)==1的时候才能保证a的逆元是x)
ax%b=1
ax-by=1(是不是和上面的基础式差不多)就是一样的。用模板回溯找到x不就是a 的逆元了吗?
现在给出模板吧 这个模板只能求形如ax+by=gcd(a,b)的式子
相关的解释会在代码中解释;
code:
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){//递归到终点 ax+by=gcd(a,b)=a 此时a就是 最大公约数
x=1;//把x=1 ,y=0带入发现满足
y=0;
return a;
}
ll r=exgcd(b,a%b,x,y);
//回溯 (一般都是在递归的后面)回溯是因为要求原方程ax+by=gcd(a,b)的解
ll temp=x;//这个证明会在下面给出解释
x= y;
y=temp-(a/b)*y;
return r;
}
这个是上面回溯的解释:
上层的式子 ax1+by1=gcd(a,b);
下层的式子 bx2+a%by2=gcd(b,a%b);
我们要求的是上层的x y
gcd(a,b)=gcd(b,a%b);
所以
ax1+by1=bx2+a%by2
ax1+by1=bx2+(a-(a/b)*b)y2
因此
ax1=ay2
by1=b(x2-(a/b)y2)
出了exgcd求逆元还有 费马小定理 ,和递推求逆元
请大家看这个博客(非常详细):
https://blog.csdn.net/qq_44797733/article/details/103037510?
扩展欧几里得求解ax+by=m的式子(m%gcd(a,b)==0)
这个式子有解的前提:m%gcd(a,b)==0 ;
然后就是这个方程如果没有对x和y有范围上的要求的话是有无线的解的
我们通过上面的模板可以求解出 ax+by=gcd(a,b)的一个特解 x y 然后等式俩边同时乘以m/gcd(a,b) 那么是不是就变成了ax+by=m的式子 ,此时的x和y也是乘过m/gcd(a,b)的,即此时x y是ax+by=m 的一个特解
现在的问题是怎么求其他的解:
我们让式子 ax+by=m 中 x+b/gcd(a,b) y-a/gcd(a,b) 代入式子得 ax+a*b/gcd(a,b)+by-a*b/gcd(a,b)=m 这里是不是ax+by=m了 相当于这个式子加一个a,b 的最小公倍数 然后又减去一个最小公倍数 。
要是x,y没范围的话就可以求解的个数了。没错是这样的。。。。
接下来给大家分享一个相关的题目:Modified LCS
这里是题解:
https://blog.csdn.net/qq_44797733/article/details/107536436
强烈建议把 逆元的求解 和本篇文章一起看 这样可以更好的学习