标签:pre lang 时间 floor 时间复杂度 复杂 答案 递推 mod
【例】求 \(1\sim N\) 模 \(P\) 的逆元,\(1\le N\le 10^7,P=10^9+7\) 。
如果逐个求解,时间复杂度为 \(O(N\log P)\) 。
逆元实际上可以线性求解。
已知 \(1^{-1}≡1(mod\ P)\),\(1^{-1}\) 为 \(1\) 的逆元。
设 \(P=k?i+r, r<i, 1<i<P\),则有:
\(k?i+r≡0(mod\ P)\)
两边同时乘以 \(i^{-1},r^{-1}\),得:
\(k?r^{-1}+i^{-1}≡0(mod\ P)\)
\(i^{-1}≡-k?r^{-1}(mod\ P)\)
\(i^{-1}≡-\left \lfloor \frac P i \right \rfloor?(P\%i)^{-1} (mod\ P)\)
可以得到一个递推式子:
inv[i]=-(P/i)*inv[P%i]; //inv[i]表示i的逆元
inv[i]=(P-P/i)*inv[P%i]; //为了避免出现负数,加上一个P,答案不变
这样可以使用递推在 \(O(n)\) 的时间求得。
标签:pre lang 时间 floor 时间复杂度 复杂 答案 递推 mod
原文地址:https://www.cnblogs.com/strve/p/13787783.html