[数论]拓展欧几里得算法
欧几里得算法(辗转相除法) 用来求解最大公约数 1 int gcd(int a,int b){ 2 return b ? gcd(b,a%b) : a; 3 } 在 #include<algorithm> 中也可以直接调用 __gcd(a,b) 拓展欧几里得算法 求解不定方程: 引理:存在 x , y 使得 gcd(a,b)=ax+b 1 typedef long long ll; 2 3 ll exgcd(ll a,ll b) 4 { 5 if(b){ 6 ll r=exgcd(b,a%b); 7 ll k=x; 8 x=y; 9 y=k-a/b*y; 10 return r; 11 } 12 else{ 13 x=1,y=0; 14 return a; 15 } 16 } 解线性同余方程 关于 x 的模方程 ax%b=c 的解,方程转换为 ax+by=c 其中 y 一般为非正整数,则问题变为用 exgcd 解不定方程 计算乘法逆元 若 a*x≡1(mod b) ,且 a与 b互质,那么我们就能定义: x为 a的逆元 这就是利用拓欧求解线性同余方程 a*x≡c(mod b) 的 c=1 的情况。我们就可以转化为解 a*x + b*y = 1这个方程 1 typedef long long ll; 2 3 void exgcd(ll a,ll b)//扩展欧几里得算法求乘法逆元