当前位置: 首页 > news >正文

扩展中国剩余定理 ExCRT 总结

求解类似于下图的问题

image

求法 数学归纳法实现 ExCRT

设前 \(k - 1\) 个方程的最小非负整数解为 \(x_0\),前 \(k - 1\) 个方程的模数的 \(\operatorname{lcm}\)\(M\),则其通解为 \(X = x_0 + Mt\)

对于第 \(k\) 个方程

\[x \equiv a_k \pmod {m_k} \]

则我们要找到一些 \(t\) 使得满足下式,这样才能同时满足前 \(k\) 个方程(其实就是找一个满足下式的解的子集)

\[X \equiv a_k \pmod {m_k} \]

\[x_0 + Mt \equiv a_k \pmod {m_k} \]

\[Mt \equiv a_k - x_0 \pmod {m_k} \]

转化为不定方程

\[Mt + m_ks = a_k - x_0 \]

用 Exgcd 解出 \(t\) 的解集,就能求出同时满足前 \(k\) 个方程的解集。
若方程无解,则方程组无解。
否则更新答案 \(x_0 = x_0 + Mt,M = \operatorname{lcm}(M, m_k)\)

Code

#define int long long
int ExCRT(int a[], int m[]) {int ans = 0, lcm = 1;for (int i = 1; i <= n; i++) {int x = 0, y = 0, c = ((a[i] - ans) % m[i] + m[i]) % m[i];;int d = Exgcd(lcm, m[i], x, y);if (c % d) {	return -1;}int mod = lcm / d * m[i];x = F(Mul(x, c / d, mod), mod);ans = ans + Mul(x, lcm, mod);lcm = mod;}return ans;
}

要点

  • #define int long long 在数学题中尽量用
  • 注意乘法是否超出 long long 范围
  • 注意要把 ans 变成非负整数,或把 x 变成非负整数
  • 初始将 int ans = 0, lcm = 1
  • 事实上,\(x\) 的模数是 \(\frac{m[i]}{d}\) 还是 \(mod\) 都是一样的,因为 \(\frac{m[i]}{d} \mid mod\) 且最终反正都是会模上 \(mod\)

Problem

P4777 【模板】扩展中国剩余定理(EXCRT)

P3868 [TJOI2009] 猜数字

题解

\[b_i \mid (n - a_i) \]

\[n - a_i \equiv 0 \pmod {b_i} \]

\[n \equiv a_i \pmod {b_i} \]

板子即可

P2421 [NOI2002] 荒岛野人

题解

因为答案值域比较小,所以考虑枚举答案 \(m\),那么我们需要判断一个答案是否合法,也就是要判断是否会出现两个奶龙在同一个洞里。因为 \(n\) 很小,所以枚举冲突的两只奶龙。两只奶龙 \(i, j\) 冲突等价于存在 \(t\) 使得

\[c_i + tp_i \equiv c_j + tp_j \pmod m (t \le l_i, l_j) \]

\[t(p_i - p_j) \equiv c_j - c_i \pmod m (t \le l_i, l_j) \]

这是一个同余方程的形式,但我们有很多个这样的同余方程,所以可以用 ExCRT 来求解。吗?
事实上,我们要求的是解的并集(是否有某个方程存在解,等价于方程解的并集是否为空),而 ExCRT 求解的是满足所有方程的解集,也就是解的交集。

所以这道题的意义出现在 ExCRT 专题的原因就是最后一句话。

启示

  • 最后一句话

P4774 [NOI2018] 屠龙勇士

其实屠的是我这个奶龙吧

题解

读题可知,在屠龙过程中我们能决策的只有 \(x\)。我们可以用平衡树求出对每条龙会用那把剑打他,记剑的攻击力为 \(atk_i\)。则我们就是要找到最小 \(x\) 使得

\[a_i - atk_ix \equiv 0 \pmod {p_i}(a_i \le atk_ix) \]

可化为

\[atk_ix \equiv a_i \pmod {p_i}(a_i \le atk_ix) \]

这正是一个同余方程的形式,我们先考虑求出这些同余方程的解的交集,然后在满足后面的条件。

将原同余方程记作

\[a_ix \equiv b_i \pmod {m_i} \]

我们要求交集,所以要用 ExCRT,但这并不是标准的 \(x \equiv b_i \pmod {m_i}\) 的形式。并且 \(a_i\) 不一定与 \(m_i\) 互质,所以不一定有逆元可以把他移到右边。这时,我们考虑能否使用 ExCRT 的变种ExExCRT来求解形如上式的同余方程组的解的交集。


数学归纳法实现 ExExCRT

设前 \(k - 1\) 个方程的最小非负整数解为 \(x_0\),则其通解为 \(X = x_0 + Mt\)。(这里不将 \(M\) 定义为 \(m_i(i < k)\)\(\operatorname{lcm}\)。因为求解的过程中,\(M\) 的定义就是 \(x\) 的解系中的周期,在 ExCRT 中定义为 \(\operatorname{lcm}\) 是因为最小周期恰好就是这个,这样定义方便理解和计算。)
对于第 \(k\) 个方程

\[a_kx \equiv b_k \pmod {m_k} \]

则我们要找到一些 \(t\) 使得满足下式,这样才能同时满足前 \(k\) 个方程(其实就是找一个满足下式的解的子集)

\[a_kX \equiv b_k \pmod {m_k} \]

\[a_k(x_0 + Mt) \equiv b_k \pmod {m_k} \]

\[a_kMt \equiv b_k - a_kx_0 \pmod {m_k} \]

转化为不定方程

\[a_kMt + m_ks = b_k - a_kx_0 \]

在 Exgcd 求解过程中记作

\[At + Bs = C \]

用 Exgcd 求解。
若方程无解,则方程组无解。
否则更新答案 \(x_0 = x_0 + Mt,M = \frac{MB}{\gcd(A, B)} = \frac{Mm_k}{\gcd(a_kM, m_k)}\)。(在 ExCRT 中 \(M = \operatorname{lcm}(M, m_k)\),这是基于 \(M\) 的特殊定义得出的。但在 ExExCRT 中,\(M\) 不存在这样的定义,所以要从解系的角度求解出 \(M\)。设,在前 \(k - 1\) 个方程中,\(x\) 的解系为 \(X = x_0 + Mt\)。在 Exgcd 中,我们可以得到 t 的解系 \(T = t_0 + \frac{uB}{\gcd(A, B)} = t_0 + \frac{um_k}{\gcd(a_kM, m_k)}\),则可得 \(x\) 的新解系 \(X = x_0 + MT = x_0 + M(t_0 + \frac{um_k}{\gcd(a_kM, m_k)}) = (x0 + Mt_0) + \frac{Mum_k}{\gcd(a_kM, m_k)}\)。在解系的定义中,\(X = x_0 + Mt\) 中的 \(t\),和 \(X = (x0 + Mt_0) + \frac{Mum_k}{\gcd(a_kM, m_k)}\) 中的 \(u\) 都只是周期的乘数,它们的定义域都是非负整数集,所以可以等效替换。得 \(X = (x0 + Mt_0) + \frac{Mm_k}{\gcd(a_kM, m_k)}t\),从这个形式可以看出 \(M = \frac{Mm_k}{\gcd(a_kM, m_k)}\)

启示

  • ExExCRT 可以解一般的同余方程组
  • \(X,T,x_0,t_0,M\) 等 ExCRT 中的变量的定义和计算方法都很重要
http://www.jsqmd.com/news/425536/

相关文章:

  • 搭建WSL2环境
  • MarkDown基本语法之我的第一篇博客
  • 小递查查:一键智查快递,全场景物流管理效率革命
  • 毕业论文AI写作网站大全,技巧一键get
  • 16个AI论文生成工具,附高效使用秘诀
  • YashanDB的errno 24, error message Too many open files故障分析
  • 16个高效AI论文写作网站,技巧全解析
  • 深度学习篇---多模态
  • 毕业论文必备:16个AI写作平台及使用攻略
  • 毕业论文神器:16个AI写作工具使用指南
  • 欧拉函数 总结
  • 16大AI论文助手盘点,附详细技巧分享
  • AI Agent在智能浴缸中的水疗模式个性化
  • PowerShell 批量下载 SharePoint Online 文档
  • 论文写作利器:16个AI网站推荐与技巧
  • 16款AI论文写作网站推荐,附操作指南
  • 16个AI工具助力毕业论文,附实用方法
  • K8S负载均衡原理详解 - 智慧园区
  • 提示系统从崩溃到稳定:架构师的30天服务治理改造记
  • 北京GEO服务商怎么挑?2026年AI获客实战指南 - 品牌2025
  • Java编译报码8273代码解决的思路
  • 北京GEO服务商哪家强?2026年AI获客能力全景透视 - 品牌2025
  • 基于springboot框架的交通事故档案管理平台的设计与实现_o63l5u1o
  • 基于springboot框架的大学生健康管理系统_35l867i9
  • Dora视觉集成系统
  • 2026年琼海人气海鲜店推荐,抢先体验最值得的琼海海鲜大餐排行榜
  • Gaia 与 ARE:赋能社区的智能体评测
  • 提示工程架构师:解决prompt效率低下的5个创新实践技巧
  • HuggingFace
  • 讲讲 Redis 集群为什么只有 0 号数据库?