中国剩余定理

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 | 国际竞赛,适合提升 |