一、什么是乘法逆元:
在解决模数问题的时候,我们发现,也就是除法计算中的取模,不能像加减乘那样先取模再计算。所以要把除法转换成乘法,即找到一个数,使得,那么我们就可以转换成乘法的取模来处理。这个数就叫做 b 的 乘法逆元。
二、怎么求
1.费马小定理
对于任意质数p,有,
又因为,其中x就是我们要求的乘法逆元。
转换一下就能知道,,这就是这种求法的原理,那么我们用快速幂求出模p下的即可。
int fpm(int x,int pow,int mod){ //费马小定理
//求x在mod意义下的逆元(其实是计算mod下x^pow,其中pow=p-2)
x %= mod;
int ans = 1;
for(; pow; pow>>=1, x=x*x%mod)
if(pow&1) ans=ans*x%mod;
return ans;
}
2.阶乘逆元(求1!, 2!, 3! ......n!的逆元)
inline void init(){
fac[0]=fac[1]=1; //初始化0!和1!
for(int i=2;i<=N;i++)fac[i]=fac[i-1]*i%mod; //递推计算n!
inv[N]=Pow(fac[N],mod-2); //fpm单独求出inv[N]
for(int i=N-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod; //后面的根据inv[N]进行递推
}
3.线性递推(用于求一串连续数字的乘法逆元)
inv[1] = 1;
for(int i = 2; i<=n; ++ i)
inv[i] = (mod - mod / i) * inv[mod % i] % mod;