GCD 与 EXGCD
欧几里得算法
核心等式:,当 时返回 。
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}扩展欧几里得(EXGCD)
求 的一组整数解。
int exgcd(int a, int b, int &x, int &y) {
if (!b) { x = 1; y = 0; return a; }
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}解满足 。
模逆元
当 时, 在模 下存在逆元。
方法一:费马小定理( 为素数):。
方法二:EXGCD:求解 。
方法三:线性递推( 为素数,预处理 逆元):
vector<int> inv(n + 1);
inv[1] = 1;
for (int i = 2; i <= n; ++i)
inv[i] = (long long)(p - p / i) * inv[p % i] % p;方法四:批量逆元():预处理前缀积 ,求 后回推。
练习题目
| 题目 | 描述 |
|---|---|
| P1082 【模板】同余方程 | EXGCD 求 |
| P3811 【模板】模意义下的乘法逆元 | 线性求逆元 |
| P5431 【模板】乘法逆元 2 | 批量逆元 |
相关链接
来源:OI-wiki gcd.md & inverse.md
多平台练习
| 洛谷 | 本题单 | 竞赛基础 |
| POJ (北大) | PKU JudgeOnline | 经典题目,适合巩固 |
| HDU (杭电) | HDU OJ | 暑期多校训练 |
| Codeforces | Codeforces | 国际竞赛,适合提升 |