一
扩展欧几里得算法
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
x=(x%p+p)%p;
x即为a在模p下的逆元
二
费马小定理+快速幂
a在p下的逆元即为a^(p-2),当且仅当p为素数时成立
int ksm(int a,int b,int p)
{
int res=1;
while(b)
{
res=(ll)*res*a%mod;
a=(ll)a*a%mod;
b>>=1;
}
return res;
}
x=ksm(a,p-2,p);
三
线性求逆元
inv[i]表示i的逆元,有递推公式 inv[i]=(p-p/i)*inv[p%i]%p;
//线性求逆元
typedef long long ll;
int inv[N]; //inv[i]表示i的逆元
int main()
{
int n,p;
cin>>n>>p;
inv[1]=1;
for(int i=2;i<=n;i++) //从2开始,防止inv[1]的值改变
inv[i]=(ll)(p-p/i)*inv[p%i]%p; //强转long long 防止爆int
}