老猴子辛苦了一生,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分红五堆,五堆同样多,但还多出一个。它把剩下的一个留给老猴子,本身拿走其中的一堆。
第二个猴子来了,它把桃子分红五堆,五堆同样多,但又多出一个。它把多出的一个留给老猴子,本身拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子所有留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能获得几个桃子。java
输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤20)。
输入以0结束,该行不作处理。算法
每组测试数据对应一行输出。
包括两个整数a,b。
分别表明开始时最小须要的桃子数,和结束后老猴子最少能获得的桃子数。数组
5 1 0
3121 1025 1 1
假设桃子一块儿有x个,第i只猴子用ai表示,第一只儿子拿走的桃子数为:a1=15(x−1)。第二只儿子拿走的桃子数为:a2=(4a1−1)5,第三只猴子拿走的桃子数为:a3=(4a2−1)5,••••••以此类推。
根据分析有递推关系:测试
an=(4an−1−1)5spa
⇔5an=4an−1−1.net
⇔5(an+1)=4(an−1+1)code
得图片
an+1=(45)n−1(a1+1)get
⇔an=(45)n−1(a1+1)−1io
又a1=15(x−1)代入可得:
an=(45)n−1(15(x−1)+1)−1
⇔an=4n−15n(x+4)−1
由于an为整数,因此x+4是5n的倍数。要取x最小,令x+4=5n,得:
x=5n−4
即为所求的总的桃子数。
全部小猴子分得的桃子数:
∑i=1nai
⇔∑i=1n((45)i−1(ai+1)−1)
⇔(ai+1)∑i=1n(45)i−1−n
⇔(ai+1)(1−(45)n1−45)−n
又,a1=15(x−1),x=5n−4,得:
a1=5n−1−1
再得:
5n−1(1−(45)n1−45)−n
⇔4∗5n−1−4n−n
所以小猴子们分的桃子总数为:
5n−4n−n
5n−4−(5n−4n−n)
⇔4n+n−4
import java.util.Scanner; /** * Declaration: All Rights Reserved !!! */ public class Main { public static void main(String[] args) { // Scanner scanner = new Scanner(System.in); Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNext()) { int n = scanner.nextInt(); if (n == 0) { break; } long[] r = peach(n); System.out.println(r[0] + " " + r[1]); } scanner.close(); } /** * 分桃子 * <p> * 解题思路:见PDF或者WORD * * @param n 小猴子的数目 * @return 长度为二的一维数组,第一个表示最少的桃子数目,第二个表示老猴子最小能够获得的桃子数 */ private static long[] peach(int n) { long power5 = 1; long power4 = 1; for (int i = 0; i < n; i++) { power4 *= 4; power5 *= 5; } return new long[]{power5 - 4, power4 + n - 4}; } }