**同余中的逆(乘法逆元)**是连接CSP-J和CSP-S的重要概念,理解它会让你的数论知识更成体系。
下面我为你系统讲解"逆"是什么、怎么求、以及CSP-J/CSP-S中可能出现的典型例题。
一、什么是乘法逆元?
1.1 从"倒数"说起

1.2 举个具体例子

二、逆元存在的条件(重点!)
核心定理:
a 在模 m 下存在乘法逆元 ⇔ gcd(a, m) = 1(a 和 m 互质)
为什么?
方程 ax≡1(modm)ax≡1(modm) 等价于 ax−my=1ax−my=1,即 ax+my=1ax+my=1。
根据裴蜀定理,这个方程有整数解当且仅当 gcd(a, m) | 1,即 gcd(a, m) = 1。
特例: 当模数 m 是质数 p 时,只要 a 不是 p 的倍数,就一定有逆元。
判断练习:
| a | m | gcd(a,m) | 是否有逆元 |
|---|---|---|---|
| 3 | 10 | 1 | ✅ 有 |
| 2 | 10 | 2 | ❌ 无 |
| 4 | 9 | 1 | ✅ 有 |
| 6 | 9 | 3 | ❌ 无 |
| 7 | 13 | 1 | ✅ 有 |
三、求逆元的三种方法
方法1:枚举法(适合小模数)
适用场景: m 很小(CSP-J级别)
步骤: 从 1 到 m-1 枚举 b,检查 a×b≡1(modm)a×b≡1(modm)
cpp
int inv(int a, int m) {
for (int b = 1; b < m; b++) {
if ((a * b) % m == 1) return b;
}
return -1; // 不存在逆元
}
例题: 求 4 在模 9 下的逆元。
- 枚举:4×1=4,4×2=8,4×3=12≡3,4×4=16≡7,4×5=20≡2,4×6=24≡6,4×7=28≡1 ✓
- 答案:7
方法2:扩展欧几里得算法(CSP-S要求)
原理: 求 ax+my=1ax+my=1 的一组整数解,x 就是 a 的逆元。
cpp
// 扩展欧几里得:返回 gcd(a,b),同时求出 ax + by = gcd(a,b) 的一组解
int exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1; y = 0;
return a;
}
int x1, y1;
int g = exgcd(b, a % b, x1, y1);
x = y1;
y = x1 - (a / b) * y1;
return g;
}
// 求 a 在模 m 下的逆元(要求 gcd(a,m)=1)
int modInv(int a, int m) {
int x, y;
int g = exgcd(a, m, x, y);
if (g != 1) return -1; // 不存在逆元
return (x % m + m) % m; // 保证结果为正
}
方法3:费马小定理(模数为质数时)

cpp
// 用快速幂求 a^{p-2} mod p
int modInv(int a, int p) {
return quickPow(a, p-2, p); // p 必须为质数
}
四、逆元的核心应用
应用1:解同余方程

应用2:模意义下的除法

应用3:组合数取模(CSP-S重点)

五、CSP-J 典型例题(概念判断型)
例题1(存在性判断)
题目: 在模 8 的意义下,下列哪个数存在乘法逆元?
A. 2 B. 3 C. 4 D. 6
答案:B
解析: 存在逆元 ⇔ gcd(a,8)=1
-
gcd(2,8)=2 ❌
-
gcd(3,8)=1 ✅
-
gcd(4,8)=4 ❌
-
gcd(6,8)=2 ❌
选B。
例题2(同余方程)
题目: 同余方程 5x≡3(mod7)5x≡3(mod7) 的解是( )
A. 1 B. 2 C. 3 D. 4
答案:B
解析: 5 在模 7 下的逆元是 3(5×3=15≡1)
x ≡ 3×3 = 9 ≡ 2 (mod 7)
验证:5×2=10≡3 ✓
选B。
例题3(模运算变形)
题目: 已知 a≡2(mod5)a≡2(mod5),b≡3(mod5)b≡3(mod5),则 a×(mod5) 的值为( )
A. 1 B. 2 C. 3 D. 4
答案:D
解析: 3 在模 5 下的逆元是 2(3×2=6≡1)
a × ≡ 2 × 2 = 4 (mod 5)
选D。