1.线性求逆元
假设模数为p, p=i⋅k+r,k,r∈Z,0≤r<ip=i\cdot k+r,k,r\in \Z,0\leq r<ip=i⋅k+r,k,r∈Z,0≤r<i
两边同时对p取mod得: 0≡i⋅k+r(modp)0\equiv i\cdot k+r\pmod p0≡i⋅k+r(modp)
两边同时乘i−1⋅r−1i^{-1}\cdot r^{-1}i−1⋅r−1,把i−1i^{-1}i−1分离出来 得: 0≡k⋅r−1+i−1(modp)0\equiv k\cdot r^{-1}+i^{-1}\pmod p0≡k⋅r−1+i−1(modp)
进而i−1≡−k⋅r−1(modp)i^{-1}\equiv -k\cdot r^{-1}\pmod pi−1≡−k⋅r−1(modp)
回到p=i⋅k+rp=i\cdot k+rp=i⋅k+r, 可以推出k=⌊p/i⌋,r−1=(p%i)−1k=\lfloor p/i \rfloor, r^{-1}=(p\%i)^{-1}k=⌊p/i⌋,r−1=(p%i)−1
代入即可: i−1≡−⌊p/i⌋⋅(p%i)−1(modp)i^{-1}\equiv -\lfloor p/i \rfloor\cdot (p\%i)^{-1}\pmod pi−1≡−⌊p/i⌋⋅(p%i)−1(modp)
写成代码一句话
inv[i]=-MOD/i*inv[MOD%i];
inv[i]=(MOD-MOD/i)*inv[MOD%i];//更好
预处理inv[0]=inv[1]=1就完工.
2.费马小定理求逆元
经典中的经典,如果(a,m)=1(a,m)=1(a,m)=1
am≡a(modm)a−1=am−2
\begin{aligned}
a^m &\equiv a\pmod m\\
a^{-1} &= a^{m-2}
\end{aligned}
ama−1≡a(modm)=am−2
3.exgcd求逆元
设x=a−1x=a^{-1}x=a−1,
ax≡1(modm)ax \equiv 1 \pmod max≡1(modm)
等价于
ax+my=1ax + my = 1ax+my=1
这样一个exgcd能解决的问题。
实际情况下:
exgcd(a,p,x,y);
x=(x%m+m)%m;
其他小技巧
求阶乘逆元
注意乘的是i+1i+1i+1
fac[0]=1;for(int i=1;i<=N;i++) fac[i]=fac[i-1]*i%MOD;
ifac[N]=qmod(fac[N], MOD-2);
for(int i=N-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%MOD;
本文介绍了三种求模数逆元的方法:线性求逆元、费马小定理求逆元及exgcd求逆元,并给出了求阶乘逆元的具体步骤。
1454

被折叠的 条评论
为什么被折叠?



