1 定义
如果一个线性同余方程 \(ax \equiv 1 \pmod b\),则 \(x\) 称为 \(a \bmod b\) 的逆元,记作 \(a^{-1}\)。 ## 2 费马小定理: \(x \equiv a^{b-2} \pmod b\)。\(p\) 为质数才成立
3 [[拓展欧几里得]]:
1 | void Exgcd(ll a, ll b, ll &x, ll &y) { |
4 线性递推求法:
1 | int inv[1000000]; |
5 线性求任意 n 个数的逆元
上面的方法只能求 \(1\) 到 \(n\) 的逆元,如果需要求任意给定 \(n\) 个数(\(1 \le a_i < p\))的逆元,就需要下面的方法:
首先计算 \(n\) 个数的前缀积,记为 \(s_i\),然后使用快速幂或扩展欧几里得法计算 \(s_n\) 的逆元,记为 \(sv_n\)。
因为 \(sv_n\) 是 \(n\) 个数的积的逆元,所以当我们把它乘上 \(a_n\) 时,就会和 \(a_n\) 的逆元抵消,于是就得到了 \(a_1\) 到 \(a_{n-1}\) 的积逆元,记为 \(sv_{n-1}\)。
同理我们可以依次计算出所有的 \(sv_i\),于是 \(a_i^{-1}\) 就可以用 \(s_{i-1} \times sv_i\) 求得。
所以我们就在 \(O (n + \log p)\) 的时间内计算出了 \(n\) 个数的逆元。
1 | s[0] = 1; |
6 一些练习题
6.1 乘法逆元 - OI Wiki 这里有几道题
6.2 [[B3645 数列前缀和 2 - 洛谷]]
链接 ### 6.3 B3646 数列前缀和 3 - 洛谷