码迷,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
迷上了代码!