这是一个黑科技。 可以将某些题目硬生生地压到O(N) 不过这求的是1~n的逆元,多了不行……
接下来放式子:
inv[i]=(M-M/i)*inv[M%i]%M;
用数学方法来表示: i−1=(M−⌊Mi⌋)(Mmod  i)−1mod  Mi^{-1}=left(M-lfloorfrac{M}{i} floor ight)left(Mmod i ight)^{-1}mod Mi−1=(M−⌊iM⌋)(Mmodi)−1modM
设k=⌊Mi⌋k=lfloorfrac{M}{i} floork=⌊iM⌋,r=Mmod  ir=M mod ir=Mmodi ∴ik+r≡0(mod  M)∴−ik≡r(mod  M) herefore ik+r equiv 0 left(mod M ight) \ herefore -ik equiv r left(mod M ight)∴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 ight) \ herefore 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-lfloorfrac{M}{i} floor ight)left(Mmod i ight)^{-1}mod Mi−1=(M−⌊iM⌋)(Mmodi)−1modM