普通求逆元
\[ax≡1\ (mod\ p)\]
其中\(x\)就是\(a\)在模\(p\)意义下的乘法逆元\((inv)\)
\(gcd(a,p)=1\)时存在,即\(a\)在模\(p\)意义下有逆元的充要条件是\(a,\ p\)互质
计算等价于解方程\(ax+bp=1\)
定义了剩余系中的除法\(\frac{a}{b}≡a × inv_p(b)\ (mod\ p)\)
费马小定理也求乘法逆元
费马小定理:若\(p\)为质数,且\(gcd(a,p)=1\)(\(a,\ p\)互质),那么\(a^{p-1}≡1(mod\ p)\)
两侧同除\(a\),即得到\(a\)的逆元:\(inv_p(a)≡a^{p-2}(mod\ p)\),用快速幂计算即可
线性求逆元
设\(p=ka+b(1<a<b<p)\),得
\[ka+b≡0\ (mod\ p)\]
等式两边同除\(ab\),得
\[inv(a)≡-k×inv(b)\ (mod\ p)\]
\[inv(a)≡-\lfloor\frac{p}{a} \rfloor×inv(p\ mod\ a)\ (mod\ p)\]
\(code:\)
for(int i=2;i<=n;++i) inv[i]=(p-p/i)*inv[p%i]%p; /*inv[i]=-p/i*inv[p%i]; inv[i]=((inv[i])%p+p)%p;*/
若所需求逆元的数不连续,考虑用前缀积解决
设\(s_i=\prod\limits_1^na_i\)
先求出\(inv(s_n)\),那么\(inv(a_n)=inv(s_n)×s_{i-1}\)
同时\(inv(s_{i-1})=inv(s_i)×a_i\)
于是便可以递推求解
\(code:\)
for(int i=n;i;--i) { inv[i]=(s[i]*s[i-1])%mod; s[i-1]=(s[i]*a[i])%mod; }
来源:https://www.cnblogs.com/lhm-/p/12229639.html