中国剩余定理
CRT(模数两两互质)
求解一元线性同余方程组( 两两互质):
步骤:
- 计算
- 对每个 ,计算 ,求 在模 下的逆元 ,得
- 解:
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;
}练习题目
| 题目 | 描述 |
|---|---|
| P1495 曹冲养猪 | CRT 模板 |
| P4777 【模板】扩展中国剩余定理 | EXCRT 模板 |
| P3868 [TJOI2009] 猜数字 | CRT 应用 |
相关链接
来源:OI-wiki crt.md
多平台练习
| 洛谷 | 本题单 | 竞赛基础 |
| POJ (北大) | PKU JudgeOnline | 经典题目,适合巩固 |
| HDU (杭电) | HDU OJ | 暑期多校训练 |
| Codeforces | Codeforces | 国际竞赛,适合提升 |