乘法逆元就是类似倒数一样的东西,适用于求模意义下的除法运算,即求导数后转换为乘法。
,即求倒数的意思。
那么我们要求 /a 的情况,就求出a的逆元,然后乘上逆元即可。
对于上面的同余方程,我们有三种求法:
1:扩欧
即把上面的式子转化为:,
求解即可。
void Exgcd(int a,int b,int &x,int &y) {
if (!b)x=1,y=0;
else Exgcd(b,a%b,y,x),y-=a/b*x;
}
signed main(){
int x,y;
cin>>a>>p;
Exgcd(a,p,x,y);
x=(x%p+p)%p;
printf("%d\n",x); //x是a在mod p下的逆元
}
2:
费马小定理:ksm: p必须为质数
int ksm(int x,int y,int mod){
int tep=x,ans=1;
while(y){
if(y&1)
ans=ans*tep%mod;
tep=tep*tep%mod;
y>>=1;
}
return ans;
}
signed main() {
int a,x,p;
cin>>a>>p;
int x=ksm(a,p-2,p); //x为a在mod p意义下的逆元
}
3:递推O(1) 求连续逆元
int n,p,inv[3000005];
signed main(){
cin>>n>>p;
inv[1]=1;
cout<<1<<"\n";
for(int i=2;i<=n;i++){
inv[i]=(p-p/i)*(inv[p%i])%p;
cout<<inv[i]<<"\n";
}
}