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;

方法四:批量逆元):预处理前缀积 ,求 后回推。

练习题目

相关链接

来源:OI-wiki gcd.md & inverse.md

多平台练习

| 洛谷 | 本题单 | 竞赛基础 |
| POJ (北大) | PKU JudgeOnline | 经典题目,适合巩固 |
| HDU (杭电) | HDU OJ | 暑期多校训练 |
| Codeforces | Codeforces | 国际竞赛,适合提升 |