笔试的时候碰到一道题, 死活不得其解, 后来看了知乎的一个解答才茅塞顿开;
问题描述:
有未知数量香蕉一堆, 有m只猴子, 第一只猴子来了之后, 把香蕉分为5堆, 刚好多1个, 于是它吃掉1个, 拿走其中一堆; 第二只猴子来了之后, 同样把香蕉分5堆, 刚好多一个, 于是它吃掉1个, 拿走其中一堆; 剩余猴子依次到来, 做同样的操作; 问这堆香蕉至少有多少个?
方案1
暴力解: 设置香蕉初始值为1, 看是否满足同样的m次操作; 由于m可能非常大, 通常会超时;
方案2
分析数学解: 因为每个猴子都将香蕉分为5堆+1个, 那么, 如果我们给它们借4个香蕉, 会发生什么呢?
香蕉变为了5堆+5个, 那么一分为5, 就是1堆+1个, 此时猴子每次拿走的香蕉数量不变, 但是每次都能够刚好被5整除.
这样的话, 就有了这样的关系, n+4至少能被5整除m次:
n
+
4
=
5
k
;
k
>
=
m
;
n+4 = 5^k; k>=m;
n+4=5k;k>=m;
n 最小为
5
m
−
4
5^m-4
5m−4;
m = 1时, n = 5-4=1
m = 2时, n =25-4=1
m = 3时, n=125-4=1