逆元
意义
若有 ,则x为a在模p下的逆元。
一个分数是不能直接模运算的,但是可以进行乘法运算
实现
欧拉定理
由欧拉定理得,若gcd(a,p)=1,则
得到,所以,为a在模p下的逆元。
费马小定理
对于质数p,若gcd(a,p)=1,则
得到 ,是a在模p下的逆元,直接快速幂求解即可。
扩展欧几里得
由 ,可以得到 ,所以,,用扩欧求x,y即可。
阶乘逆元
因为
所以 -> ->
代码
void getinv() //fac[i]为i的阶乘
{
fac[1]=inv[0]=1;
for(int i=2;i<=n;++i) fac[i]=fac[i-1]*i%mod;
inv[n]=quick_pow(fac[n],mod-2);
for(int i=n-1;i;--i)
inv[i]=inv[i+1]*(i+1)%mod;
}
1 - n 逆元
代码
void getinv()
{
inv[0]=inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=inv[p%i]*(p-p/i)%p;
}