题目描述
题目链接:猴子分桃__牛客网
老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。
输入描述:
输入包括多组测试数据。 每组测试数据包括一个整数n(1≤n≤20)。 输入以0结束,该行不做处理。
输出描述:
每组测试数据对应一行输出。 包括两个整数a,b。 分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。
示例1
输入
5 1 0输出
3121 1025 1 1
题意理解:
这道题,其实不太好理解,因为要用数学公式去推算,而不是写几个数就容易理解。老猴子给小猴子分桃,但这个工作由小猴子来做,小猴子们比较孝顺,每一只分完 5堆,都会多出一个 给老猴子,并且每一只小猴子都是从上一堆的 五分之四 - 1的桃子里,再分为5堆,然后拿出一个给老猴子,一直到所有小猴子都分完,剩下的都是老猴子的。它要问的是,你倒推一下,一开始最少要有多少个桃子,能够被不断分5次。
解题思想:
既然每次分完都要剩一个,下一个猴子要分的时候要先减1,再分五堆,这样势必很麻烦,所以为了方便,我们就假设最初有x个桃子,我们借给猴子4个,则此时有x+4个,
* 第一个猴子得到(x+4)/5,剩余(x+4)*(4/5)个
* 第二个猴子分完后剩余(x+4)*(4/5)^2个
* 第三个猴子分完后剩余(x+4)*(4/5)^3个
* 依次类推,最后一个猴子分完后剩余(x+4)*( 4/5 )^n
好了,公式推完了,但应该还是不理解,为什么要 借给小猴子们4个苹果,我们这样说,小猴子每次要给老猴子分一个苹果,这是为什么? 因为单了一个,那它不想多分一个吗? 当然想啊,怎么办,我们给它加 4个,凑成 5的倍数,这样它不就可以多拿一个了,这不是很开心。 还是举例说明, 一开始有 121个苹果,第一个猴子分 120/5 = 24,剩余 96个,第二个猴子 分 95/5 = 19 ,剩余 76个,第三个猴子 分 75 / 5 = 15个,剩余 60个,但前面三个猴子还分别孝顺了一个,所以最终老猴子有 63个。
而如果一开始 我就借给猴子们4个苹果,也就是老猴子不要它们孝顺的那一个苹果,那第一个猴子分 125/5= 25个,剩余 100个,第二个猴子分 100/5 = 20个,剩余 80个,第三个猴子分 80/5 = 16个,剩余 64个,但老猴子借出去了4个,拿回了3个,所以最终老猴子拿到的苹果数是 64-4+3 = 63个 。我们发现由于一开始给凑够了 5的整数,那之后猴子们分的全是整数,分完之后,剩余 64个,但你给出去了四个,猴子们又还你n个,所以最后还是63个。
那为什么,每个小猴子多拿了一个,最后老猴子的个数还不受影响呢?因为每一个小猴子多拿一个的同时,它分的每一堆也多了一个,剩余的每一堆也多了一个,这样分到最后,老猴子就从剩余堆里 多拿了n 个,可是一开始它少了 4个,所以最后 分完剩余的苹果数 要 +n - 4 ;
那现在再看上面的公式,所有小猴子分完剩余这些 ,(x+4)*( 4/5 )^n ,这个公式要想是整数,必须把分母 5^n
抵消掉,那就要求 x+4 是 5^n
的倍数就好了 ,它可以是 5^n ,5^(n+1),5^(n+2)... ,这些都可以使得结果为整数,但是要让整体值最小,那就取最小,也就是 5^n
,
所以解出x=5^n-4 ; 老猴子得到的数量为:old = (x+4)*(4/5)^n + n - 4 = 4^n + n - 4 。
把思想理解了,公式也有了,这道题解起来,就非常简单了。
代码注释:
// write your code here// write your code
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan =new Scanner(System.in);
while(scan.hasNextInt()){
int n = scan.nextInt();
if(n == 0)
break;
System.out.println((long)(Math.pow(5,n)-4)+" "+(long)(Math.pow(4,n)+n-4));
}
}
}