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\)头"。
解题思路
采用逐步合并同余式的策略:
- 从第一个同余式开始,得到初始解
- 逐个合并后续同余式,每次合并都保留两个同余式的公共解
- 最终得到满足所有条件的最小解
完整代码实现
代码解析
-
核心函数 merge:
- 功能:求解同时满足两个同余式的最小解
- 参数:a(第一个解), m(第一个模数), b(第二个余数), n(第二个模数)
- 逻辑:从a开始,每次加m(保证始终满足第一个同余式),直到找到满足第二个同余式的解
-
主函数流程:
- 读取同余式数量n
- 初始化第一个同余式的解和模数
- 循环合并每个新同余式:
- 调用merge函数获取新的公共解
- 更新模数为当前模数与新模数的最小公倍数(LCM)
- 输出最终解
-
关键优化:
- 使用最小公倍数作为新模数,减少后续枚举次数
- 使用long long类型避免大数值计算溢出
- 加入防无限循环判断(虽然题目保证有解)
时间复杂度分析
- 每次合并操作的枚举次数最多为两个模数的最大公约数
- 整体时间复杂度为O(n·gcd(m₁,m₂)),其中n为同余式数量,m为模数最大值
- 对于本题约束(n≤10,m≤1000),效率完全足够
示例演示
以输入:
3
3 2
5 3
7 2
为例:
- 初始解:ans=2(满足x≡2 mod 3)
- 合并x≡3 mod 5:从2开始加3,得到23(23 mod 5=3)
- 合并x≡2 mod 7:从23开始加15(LCM(3,5)),得到128(128 mod 7=2)
- 输出128
还有一道题能水:11C52AF48C7F90A25E17E71D2AD41457(MD5加密)