阿九的奶牛
题目描述
自从朱最学搞定了 QQ 农场以后,就开始捉摸去 QQ 牧场干些事业,不仅在自己的牧场养牛,还到阿九的牧场放牛!
阿九很生气,有一次朱最学想知道阿九牧场奶牛的数量,于是阿九想狠狠耍朱最学一把。
问题描述
举个例子,假如有 16 头奶牛:
- 如果建了 3 个牛棚,剩下 1 头牛就没有地方安家了
- 如果建造了 5 个牛棚,但是仍然有 1 头牛没有地方去
- 如果建造了 7 个牛棚,还有 2 头没有地方去
你作为阿九的私人秘书理所当然要将准确的奶牛数报给阿九,你该怎么办?
输入格式
第一行包含一个整数 n 表示建立牛棚的次数。
接下来 n 行,每行两个整数 ai,bi,表示建立了 ai 个牛棚,有 bi 头牛没有去处。
你可以假定不同 ai 之间互质。
输出格式
输出包含一个正整数,即为阿九至少养奶牛的数目。
数据范围
- 1≤n≤10
- 1≤ai,bi≤1200000
- 所有 ai 的乘积不超过 1012
输入样例
3
3 1
5 1
7 2
输出样例
16
样例解释
输入表示:
- 建3个牛棚,剩1头牛:N≡1(mod3)
- 建5个牛棚,剩1头牛:N≡1(mod5)
- 建7个牛棚,剩2头牛:N≡2(mod7)
求最小的正整数 N 满足以上三个同余方程。
验证 N=16:
- 16÷3=5⋯1 ✓
- 16÷5=3⋯1 ✓
- 16÷7=2⋯2 ✓
所以阿九至少有16头奶牛。
问题建模
这是一个中国剩余定理(Chinese Remainder Theorem,CRT)问题。
我们有 n 个同余方程:
$$\begin{cases}
N \equiv b_1 \pmod{a_1} \\
N \equiv b_2 \pmod{a_2} \\
\vdots \\
N \equiv b_n \pmod{a_n}
\end{cases}$$
其中 a1,a2,…,an 两两互质。
中国剩余定理
设 M=a1×a2×⋯×an,Mi=M/ai。
由于 ai 两两互质,所以 Mi 与 ai 互质,存在整数 ti 使得:
Mi⋅ti≡1(modai)
即 ti 是 Mi 模 ai 的逆元。
那么方程组的解为:
$$N \equiv \sum_{i=1}^n b_i \cdot M_i \cdot t_i \pmod{M}$$
最小正整数解为:
$$N = \left( \sum_{i=1}^n b_i \cdot M_i \cdot t_i \right) \mod M$$
算法步骤
方法1:扩展欧几里得算法
对于每个 i:
- 计算 Mi=M/ai
- 使用扩展欧几里得算法求 Mi 模 ai 的逆元 ti,即解方程:Mi⋅ti+ai⋅k=1
- 计算 ci=bi⋅Mi⋅ti
- 最终 N=(∑i=1nci)modM
方法2:逐步合并法(更稳定)
也可以每次合并两个方程:
$$\begin{cases}
N \equiv b_1 \pmod{a_1} \\
N \equiv b_2 \pmod{a_2}
\end{cases}$$
设 N=a1⋅x+b1,代入第二个方程:
a1⋅x+b1≡b2(moda2)
a1⋅x≡b2−b1(moda2)
设 d=gcd(a1,a2),由于 a1,a2 互质,d=1,所以方程有解。
解出 x≡x0(moda2),则:
N≡a1⋅x0+b1(moda1⋅a2)
这样就将两个方程合并为一个。重复这个过程直到所有方程合并。
示例计算(输入样例)
方法1:直接应用CRT
方程:
- N≡1(mod3)
- N≡1(mod5)
- N≡2(mod7)
步骤1:计算 M
M=3×5×7=105
步骤2:计算 Mi 和 ti
-
M1=105/3=35,求 35⋅t1≡1(mod3)
- 35mod3=2,所以 2⋅t1≡1(mod3)
- t1=2(因为 2×2=4≡1(mod3))
- $c_1 = b_1 \cdot M_1 \cdot t_1 = 1 \times 35 \times 2 = 70$
-
M2=105/5=21,求 21⋅t2≡1(mod5)
- 21mod5=1,所以 1⋅t2≡1(mod5)
- t2=1
- c2=1×21×1=21
-
M3=105/7=15,求 15⋅t3≡1(mod7)
- 15mod7=1,所以 1⋅t3≡1(mod7)
- t3=1
- c3=2×15×1=30
步骤3:计算 N
N=(70+21+30)mod105=121mod105=16
得到 N=16。
方法2:逐步合并
合并第1、2个方程:
N≡1(mod3) 且 N≡1(mod5)
设 N=3x+1,代入第二个方程:
3x+1≡1(mod5) ⇒ 3x≡0(mod5)
由于 3 和 5 互质,3 在模5下有逆元(3×2=6≡1(mod5)),两边乘2:
x≡0(mod5)
所以 x=5k,N=3⋅5k+1=15k+1
合并后:N≡1(mod15)
合并第3个方程:
N≡1(mod15) 且 N≡2(mod7)
设 N=15y+1,代入:15y+1≡2(mod7) ⇒ 15y≡1(mod7)
15mod7=1,所以 y≡1(mod7)
y=7t+1,N=15(7t+1)+1=105t+16
最小正整数解:N=16
数据范围分析
- n≤10,ai≤1.2×106
- 所有 ai 的乘积不超过 1012
- 结果 N 可能接近 1012,需要使用
long long 类型
扩展欧几里得算法
求 ax+by=gcd(a,b) 的解:
long long exgcd(long long a, long long b, long long &x, long long &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
long long d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
求逆元:解 a⋅x≡1(modm),即 ax+my=1。
注意事项
- 模数互质:题目保证 ai 两两互质,这是CRT可解的条件
- 数据范围:乘积可能达到 1012,中间计算可能溢出,需要使用
long long 并注意乘法溢出
- 最小正整数解:CRT给出的是模 M 意义下的解,最小正整数解为 (NmodM+M)modM,但注意如果结果为0,则解为 M
- 验证:可以验证解是否满足所有方程
时间复杂度
- 扩展欧几里得:O(logmin(a,b))
- 总体:O(nlogM),可以接受
时空限制