P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪

P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪 题解

题目分析

本题要求解一系列同余式的最小非负整数解,形式如下:

\[x ≡ \tt r_1 (mod \\tt m_1) x ≡ \tt r_2 (mod \\tt m_2) ... x ≡ \tt r_n (mod \\tt m_n) \]

其中每个方程表示"猪的数量为x时,用mᵢ个猪圈分猪后剩余\(\tt r_i\)头"。

解题思路

采用逐步合并同余式的策略:

  1. 从第一个同余式开始,得到初始解
  2. 逐个合并后续同余式,每次合并都保留两个同余式的公共解
  3. 最终得到满足所有条件的最小解

完整代码实现

代码解析

  1. 核心函数 merge

    • 功能:求解同时满足两个同余式的最小解
    • 参数:a(第一个解), m(第一个模数), b(第二个余数), n(第二个模数)
    • 逻辑:从a开始,每次加m(保证始终满足第一个同余式),直到找到满足第二个同余式的解
  2. 主函数流程

    • 读取同余式数量n
    • 初始化第一个同余式的解和模数
    • 循环合并每个新同余式:
      • 调用merge函数获取新的公共解
      • 更新模数为当前模数与新模数的最小公倍数(LCM)
    • 输出最终解
  3. 关键优化

    • 使用最小公倍数作为新模数,减少后续枚举次数
    • 使用long long类型避免大数值计算溢出
    • 加入防无限循环判断(虽然题目保证有解)

时间复杂度分析

  • 每次合并操作的枚举次数最多为两个模数的最大公约数
  • 整体时间复杂度为O(n·gcd(m₁,m₂)),其中n为同余式数量,m为模数最大值
  • 对于本题约束(n≤10,m≤1000),效率完全足够

示例演示

以输入:

复制代码
3
3 2
5 3
7 2

为例:

  1. 初始解:ans=2(满足x≡2 mod 3)
  2. 合并x≡3 mod 5:从2开始加3,得到23(23 mod 5=3)
  3. 合并x≡2 mod 7:从23开始加15(LCM(3,5)),得到128(128 mod 7=2)
  4. 输出128

还有一道题能水:11C52AF48C7F90A25E17E71D2AD41457(MD5加密)