一般求逆元有三种方法:扩欧、快速幂、递推
扩展欧几里得求逆元
由扩展欧几里得解丢番图方程可以得到逆元
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0){x=1;y=0;return a;}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll mod_inverse(ll a,ll m)
{
ll x,y;
exgcd(a,m,x,y);
return (x%m+m)%m;
}快速幂求逆元
由费马小定理,
ll mod_inverse(ll a,ll m)
{
return fast_pow(a,m-2,m);
}递推求逆元
对于
有
int inv[N];
void mod_inverse(ll n,ll p)
{
inv[1]=1;
for(int i=2;i<=n;i++)
{
inv[i]=(ll)(p-p/i)*inv[p%i]%p;
}
}