Chinese Remainder Theorem(CRT)

前两天妈妈在今日头条APP里看到了一个题目,喊我看看。

一看不当紧,这不是大学离散数学课上学的中国剩余定理(Chinese Remainder Theorem)吗?

朴素法

分析

1个1个拿,正好拿完。 // 废话 // 任何整数都能被1整除
2个2个拿,还剩1个。 // 奇数
3个3个拿,正好拿完。 // 3的倍数 // 各位数字和能被3整除
4个4个拿,还剩1个。 // 这个比“2个2个拿,还剩1个”要严格。所以条件2可以忽略了。
5个5个拿,还差1个。 // 看清看清!是“差“一个,不是”剩“一个。 // 末尾是4或9
6个6个拿,还剩3个。 // 奇数倍的3
7个7个拿,正好拿完。 // 7的倍数
8个8个拿,还剩1个。 // 这个比“4个4个拿,还剩1个”要严格。所以条件4可以忽略了。
9个9个拿,正好拿完。 // 9的倍数 // 这个比“3个3个拿,正好拿完”要严格。所以条件3可以忽略了。

化简条件

有用条件:5/6/7/8/9
7 & 9 -> 63的倍数
6 -> 63不能乘偶数
不能乘偶数 & 5 -> 末尾不可能是4 -> 末尾只可能是9

可能性

63 * 3/13/23/33/43…
哪一个先满足条件8,即是最终答案。(不用再回去验证每个条件是否满足,因为已经充分利用了上述条件。)

答案

63 * 23 = 1449

中国剩余定理(同余式)

离散数学当时学的也还可以吧。同余式搞起来。然而,我尝试了两下,并没能做出来。

Python

身为码农的我当然要利用这么牛逼的工具啊!

1
2
3
4
for i in range(20000):
if (i % 5 == 4 and i % 6 == 3 and i % 8 == 1 and i % 63 == 0):
print i
break

瞬间,你就能看到答案!