这是一个黑科技。 可以将某些题目硬生生地压到O(N) 不过这求的是1~n的逆元,多了不行……
接下来放式子:
inv[i]=(M-M/i)*inv[M%i]%M;
用数学方法来表示: i−1=(M−⌊Mi⌋)(Mmod  i)−1mod  Mi^{-1}=\left(M-\lfloor\frac{M}{i}\rfloor\right)\left(M\mod i\right)^{-1}\mod Mi−1=(M−⌊iM⌋)(Mmodi)−1modM
设k=⌊Mi⌋k=\lfloor\frac{M}{i}\rfloork=⌊iM⌋,r=Mmod  ir=M \mod ir=Mmodi ∴ik+r≡0(mod  M)∴−ik≡r(mod  M)\therefore ik+r \equiv 0 \left(\mod M\right) \\ \therefore -ik \equiv r \left(\mod M\right)∴ik+r≡0(modM)∴−ik≡r(modM) 两边同时除以iririr得 −k∗r−1≡ii−1(mod  M)∴ii−1=−k∗r−1mod  M-k*r^{-1} \equiv i^{i-1} \left(\mod M\right) \\ \therefore i^{i-1}=-k*r^{-1} \mod M −k∗r−1≡ii−1(modM)∴ii−1=−k∗r−1modM 即 i−1=(M−⌊Mi⌋)(Mmod  i)−1mod  Mi^{-1}=\left(M-\lfloor\frac{M}{i}\rfloor\right)\left(M\mod i\right)^{-1}\mod Mi−1=(M−⌊iM⌋)(Mmodi)−1modM