码迷,mamicode.com
首页 > 其他好文 > 详细

线性求逆元

时间:2020-10-10 16:40:59      阅读:17      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!