乘法逆元

普通求逆元

\[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;
}
posted @ 2020-01-22 21:02  lhm_liu  阅读(161)  评论(0编辑  收藏  举报