乘法逆元
概念讲解
什么是逆元?
如果 ,则 x 是 a 模 m 的逆元,记作 。
作用
求法
1. 扩展欧几里得
12345int inv(int a, int m) {
int x, y;
extgcd(a, m, x, y);
return (x % m + m) % m;
}条件:
2. 费马小定理
如果 p 是质数:
123int inv(int a, int p) {
return quickPowerMod(a, p - 2, p);
}条件:p 是质数
3. 线性递推
求 1~n 的逆元:
1234inv[1] = 1;
for (int i = 2; i <= n; i++) {
inv[i] = (p - p / i) * inv[p % i] % p;
}考点分析
初赛考查方式
- 程序阅读: 逆元求解
- 编程题: 组合数取模
常见考点
- 逆元求法
- 费马小定理
- 线性递推
例题精讲
例题 1:费马小定理
题目: 求 3 模 7 的逆元。
解答:
验证:3 × 5 = 15 ≡ 1 (mod 7)
练习题
- 逆元的作用是什么?
查看答案
逆元的作用是将除法取模转化为乘法取模:
在组合数取模、分数取模等问题中非常有用。
- 费马小定理的条件是什么?
查看答案
费马小定理的条件:
- p 是质数
- a 不是 p 的倍数(即 )
结论:
所以:
- 线性递推的时间复杂度是多少?
查看答案
1234inv[1] = 1;
for (int i = 2; i <= n; i++) {
inv[i] = (p - p / i) * inv[p % i] % p;
}可以一次性求出 1~n 的所有逆元。
易错点
⚠️ 注意:
- 逆元存在条件:gcd(a, m) = 1
- 费马小定理要求 p 是质数
- 线性递推只能求 1~n 的逆元
- 注意取模