今天做了一下bzoj 4011,顺便学习了一波如何线性递推求[1,p-1]在模p下的逆元。注意p为素数。
设aaa的逆元为a−1a^{-1}a−1,根据逆元的定义显然有a∗a−1≡1(modp)a*a^{-1}\equiv1\pmod pa∗a−1≡1(modp)
首先有1的逆元就是1.
假设现在已经球出了[1,a−1][1,a-1][1,a−1]的逆元,现在考虑如何求aaa的逆元。
设k=⌊pa⌋,r=pmod  ak=\lfloor\frac{p}{a}\rfloor,r=p\mod ak=⌊ap⌋,r=pmoda
有k∗a+r=pk*a+r=pk∗a+r=p
k∗a+r≡0(modp)k*a+r\equiv0\pmod pk∗a+r≡0(modp)
(k∗a+r)∗a−1∗r−1≡0(modp)(k*a+r)*a^{-1}*r^{-1}\equiv0\pmod p(k∗a+r)∗a−1∗r−1≡0(modp)
k∗r−1+a−1≡0(modp)k*r^{-1}+a^{-1}\equiv0\pmod pk∗r−1+a−1≡0(modp)
a−1≡−k∗r−1(modp)a^{-1}\equiv-k*r^{-1}\pmod pa−1≡−k∗r−1(modp)
a−1≡−⌊pa⌋∗(pmod  a)−1(modp)a^{-1}\equiv-\lfloor\frac{p}{a}\rfloor*(p\mod a)^{-1}\pmod pa−1≡−⌊ap⌋∗(pmoda)−1(modp)
a−1≡(p−⌊pa⌋)∗(pmod  a)−1(modp)a^{-1}\equiv(p-\lfloor\frac{p}{a}\rfloor)*(p\mod a)^{-1}\pmod pa−1≡(p−⌊ap⌋)∗(pmoda)−1(modp)
代码如下:
inv[1]=1;
for(int i=2;i<=n;i++)
inv[i]=(p-p/i)*inv[p%i]%p;