【智力题】—— 猴子分桃

51 篇文章 0 订阅

原题是这样的:5 只猴子一起摘了 1 堆桃子,因为太累,它们商量决定,先睡一觉再分。过了不知多久,来了第一只猴子,它见别的猴子没来,便将这一堆猴子分成五份,结果多出 1 个,就将多的这个吃了,顺便拿走其中的 1 堆。又过了不知多久,第 2 只猴子来了,它不知道有 1 个同伴已经来过,误以为自己是第 1 个到的呢,于是将地上的桃子堆起来,平均分成五份,发现也多了 1 个,同样吃了这 1 个,拿走其中的 1 堆。第 3 只、第 4 只、第 5 只猴子都是这样 … 问这 5 只猴子至少摘了多少个桃子?第 5 个猴子走后还剩多少个桃子?

1. 普通解法

设这 1 堆桃子至少 x 个,借给它们 4 个,称为 x+4 个。

5 个猴子分别拿了 a,b,c,d,e 个桃子(其中包括吃掉的一个),则可得:

a=x+45b=15×(1a)=425(x+4)c=15(1ab)=16125(x+4)d=15(1abc)=64625(x+4)e=15(1abcd)=2563125(x+4)

e 为整数,而 256不能被 3125 整除,所以 x+4 是 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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值