老猴子辛苦了一生,給那羣小猴子們留下了一筆巨大的財富——一大堆桃子。老猴子決定把這些桃子分給小猴子。
第一個猴子來了,它把桃子分紅五堆,五堆同樣多,但還多出一個。它把剩下的一個留給老猴子,本身拿走其中的一堆。
第二個猴子來了,它把桃子分紅五堆,五堆同樣多,但又多出一個。它把多出的一個留給老猴子,本身拿走其中的一堆。
後來的小猴子都如此照辦。最後剩下的桃子所有留給老猴子。
這裏有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}; } }