扩展欧几里得算法求逆元
适用于单个查找和大数
void Exgcd(lint a,lint b,lint &x,lint &y){
if(!b) x=1,y=0;
else Exgcd(b,a%b,y,x),y-=a/b*x;
}
int inverse(lint a,lint p){//求a在mod p下的逆元
lint x, y;
Exgcd (a,p,x,y);
x=(x%p+p)%p;
return x;
}
快速幂求逆元
利用费马小定理:
若p为素数,a为正整数,且a、p互质,则有 ≡(mod p)
所以此方法只适用于a、p互质的情况
//求a在mod p意义下的逆元,m为p-2,要求p为质数
lint inverse(lint a, lint m, lint p){
a%=p;
lint ans=1;
for (;m;m>>=1,(a*=a)%=p)
if(m&1) (ans*=a)%=p;
return ans;
}
递推求逆元
用于求一连串数字对于一个mod p的逆元
inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=(p-p/i)*inv[p%i]%p;