逆元:类似倒数和相反数的概念,具体自己百度,我也是百度的,这让我想起了离散数学中提到了左逆右逆,哎,离散没学好啊。
乘法逆元:我们知道
(A/B)%M=(A∗(1/B))%M
。令
1/B
等于
H
,那么
那么我们如何求乘法逆元呢
- 扩展欧几里得算法
- 费马小定理
扩展欧几里得算法
B∗H≡(1%M) 可以等价于 B∗X+M∗Y=1 ,那么我们主需要调用欧几里得算法求解出来就可以了。
int cal(int a,int b)
{
int x,y;
int Gcd=gcd_extend(a,b,x,y);
if(1%Gcd)
return -1;
x*=1/Gcd;
b/=Gcd;
b=b<0? -b:b;
int ans=x%b;
ans=ans<=0? ans+b:ans;
return ans;
}
费马小定理
费马小定理:假如M是素数,且H与M互质,那么 HM−1≡(1%M)
那么联立我们之前的 A∗H≡(1%M)
得出乘法逆元 H=AM−2
这个地方不能简单调用Pow这个库函数,我们要自己写一个带模的快速幂算法。
int cal(int x,int m,const int MOD)
{
int ans=1;
while(m){
if(m&1)
ans=ans*x%MOD;
m>>=1;
x=x*x%MOD;
}
return ans;
}
参考