原题是这样的:5 只猴子一起摘了 1 堆桃子,因为太累,它们商量决定,先睡一觉再分。过了不知多久,来了第一只猴子,它见别的猴子没来,便将这一堆猴子分成五份,结果多出 1 个,就将多的这个吃了,顺便拿走其中的 1 堆。又过了不知多久,第 2 只猴子来了,它不知道有 1 个同伴已经来过,误以为自己是第 1 个到的呢,于是将地上的桃子堆起来,平均分成五份,发现也多了 1 个,同样吃了这 1 个,拿走其中的 1 堆。第 3 只、第 4 只、第 5 只猴子都是这样 … 问这 5 只猴子至少摘了多少个桃子?第 5 个猴子走后还剩多少个桃子?
1. 普通解法
设这 1 堆桃子至少 x 个,借给它们 4 个,称为
5 个猴子分别拿了 a,b,c,d,e 个桃子(其中包括吃掉的一个),则可得:
a=x+45b=15×(1−a)=425(x+4)c=15(1−a−b)=16125(x+4)d=15(1−a−b−c)=64625(x+4)e=15(1−a−b−c−d)=2563125(x+4)
e 为整数,而 256不能被 3125 整除,所以
x+4=3125×k
当 k=1 时,x=3121。
2. tricky solution
题目难在每次分都多 1 个桃子,实际上可理解为少 4 个,先借给它们 4 个再分。
巧的是,桃子尽管多了 4 个,每个猴子得到的桃子并不会因此增多,当然更不会因此减少。稍加思考,我们能得出一个基本结论,就是桃子增加 4 个之后,能够被 55 整除,所以至少是 3125.
最后算剩余的桃子:
# python
f = lambda x: x - x//5 - 1
f(f(f(f(f(5**5)))))
# 当然这样写,比较丑陋
x = 5**5
for _ in range(5):
x = f(x)
最后剩余 1020 个。
3. 猴子摘桃问题的变体
考虑将经典的猴子摘桃的每次余 1,变为每次余 2,此时问题的解是怎样的?
x+3+5=55
f = lambda x: x - x//5 - 2
x = 5**5 - 8
for _ in range(5):
x = f(x)

6024

被折叠的 条评论
为什么被折叠?



