前两天妈妈在今日头条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 | for i in range(20000): |
瞬间,你就能看到答案!