普通求逆元
[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)≡-lfloorfrac{p}{a}
floor×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=prodlimits_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;
}