线性求逆元

【例】求 \(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)\) 的时间求得。

posted @ 2020-10-09 20:02  _BOSS  阅读(168)  评论(0)    收藏  举报