中国剩余定理

CRT(模数两两互质)

求解一元线性同余方程组( 两两互质):

步骤

  1. 计算
  2. 对每个 ,计算 ,求 在模 下的逆元 ,得
  3. 解:
LL crt(int k, LL* a, LL* r) {
  LL n = 1, ans = 0;
  for (int i = 1; i <= k; i++) n = n * r[i];
  for (int i = 1; i <= k; i++) {
    LL m = n / r[i], b, y;
    exgcd(m, r[i], b, y);
    ans = (ans + a[i] * m * b % n) % n;
  }
  return (ans % n + n) % n;
}

EXCRT(模数不互质)

两两合并。设两个方程

转化为 ,用 EXGCD 求解。若 则无解。合并后模数为

LL excrt(int k, LL* a, LL* m) {
  LL ans = a[1], M = m[1];
  for (int i = 2; i <= k; i++) {
    LL x, y, d = exgcd(M, m[i], x, y);
    if ((a[i] - ans) % d) return -1;
    x = (a[i] - ans) / d * x % (m[i] / d);
    ans += x * M;
    M = M / d * m[i];
    ans = (ans % M + M) % M;
  }
  return ans;
}

练习题目

相关链接

来源:OI-wiki crt.md

多平台练习

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