2 条题解
-
3
普及一下初等数论知识。
首先设 为公鸡、母鸡的数量,则 为小鸡的数量。我们有二元一次方程:
而题目即要我们求出它所有满足 的解。
枚举太不牛了,像是原始社会人类的做法。本文将介绍一种古希腊时代的做法。
扩展欧几里得算法
前置知识:辗转相除法。
对于一个一般的二元一次方程:
其有 整数 解的充要条件是 。
必要性显然,因为左边一定是 的整数倍。考虑证明充分性。
此时原方程的解和 的解一一对应。我们考虑证明这个方程一定有整数解。
回顾辗转相除法中的二元组序列 ,把 的系数当成这个二元组序列中的第一项。记 表示最小的 使得 。此时会满足 。
特解
记 表示 的任意一组解。则 。否则 可以通过 推出。
辗转相除保证了每一个二元组中的两数最大公约数相等。下文记 为所有二元组的 。
具体如下:
首先我们有 。
代入 得到:
把 写成一般形式,得到:
$$b_ix_{i+1}+\left(a_i-b_i\left\lfloor\dfrac{a_i}{b_i}\right\rfloor\right)y_{i+1}=g $$整理得:
$$a_iy_{i+1}+b_i\left(x_{i+1}-\left\lfloor\dfrac{a_i}{b_i}\right\rfloor y_{i+1}\right)=g $$令 ,$y_i=x_{i+1}-\left\lfloor\dfrac{a_i}{b_i}\right\rfloor y_{i+1}$ 即可。
于是我们通过 推出了一组可行的 。
求特解的过程就是在辗转相除时顺带求 ,递归的层数仍然是 ,因此时间复杂度为 。
通解
我们得到一组 后,扩大 倍,得到 的一组特解。
我们先认为 均为正值,因为可以通过调节解前面的符做到这一点,且得到的新方程和原方程的解一一对应。
至于通解,考虑将 加上一个偏移量 , 相应减去一个偏移量 。在此基础上希望偏移量尽量小。则:
注意到 ,那么两边同时减去 得 。
记 ,两边同时除以 得 。那么令 即可得到一组极小的偏移量。
如何证明她是最小的?假设最小的偏移量 满足 且 ,,将两式相除得 。记这个比值为 ,且 。则有 。
此时还需要一个引理:
若 ,,则 。
时显然,否则根据扩展欧几里得算法可以得出一定存在整数对 使得 。那么 。由于 和 都是 的倍数,所以 。
那么根据引理 为 的公约数。而由于 是最小的偏移量,她们一定互质,否则可以通过除以最大公约数得到一组更小的偏移量。因此 。那么 。而 为正整数,会导出 ,。矛盾。
因此 就是一组最小的偏移量。
记一开始的特解为 ,那么通解的公式就是 $\left(x_0+\dfrac{kb}{g},y_0+\dfrac{ka}{g}\right),k\in \mathbb{Z}$。注意我们之前做了一些一一对应工作,可能还要将解映射回原方程。
这样得到的 一定是解,且一定不会遗漏掉任何一个解。可以假设遗漏掉的解,然后找到最接近她的通解,从而导出更小的偏移量,与已知条件矛盾。
有通解公式还不够,我们需要找到满足 均为正整数的解。此时相当于给 加了一个取值范围,容易二分求出这个取值范围。
那么就可以做到在 时间内求出解的个数 。如果仅仅到这一步,可以明显体现出扩展欧几里得算法的优势。但是在要求输出所有解的情况下,时间复杂度会变为 。而最坏情况下 。因此在此情形下和暴力没有本质区别。不过处理一些 的问题(譬如本题)时还是能够体现其优势。
信息
- ID
- 271
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 7
- 标签
- 递交数
- 17
- 已通过
- 9
- 上传者