猴子分桃
Problem Description
老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。
Input
输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤10)。
输入以0结束,该行不做处理。
Output
每组测试数据对应一行输出。
包括两个整数a,b。
分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。
Sample Input
5 1 0
Sample Output
3121 1025
1 1
#include<stdio.h>int main()
{
long long int k;
long long int p;
int n, i;
while(~scanf("%d", &n) &&n != 0)
{
k = 1;
for(i = 0; i < n; i++)
{
k = k * 5;
}
k = k - 4;
p = k;
for(i = 0; i < n; i++)
{
p = (p - 1) / 5 * 4;
}
p = p + n;
printf("%lld %lld\n", k, p);
}
return 0;
}
解题
假设桃子一起有x个,第i只猴子用aiai表示,第一只儿子拿走的桃子数为:a1=15(x−1)a1=15(x−1)。第二只儿子拿走的桃子数为:a2=(4a1−1)5a2=(4a1−1)5,第三只猴子拿走的桃子数为:a3=(4a2−1)5a3=(4a2−1)5,••••••以此类推。
根据分析有递推关系:
an=(4an−1−1)5an=(4an−1−1)5⇔5an=4an−1−1⇔5an=4an−1−1⇔5(an+1)=4(an−1+1)⇔5(an+1)=4(an−1+1)
得
an+1=(45)n−1(a1+1)an+1=(45)n−1(a1+1)⇔an=(45)n−1(a1+1)−1⇔an=(45)n−1(a1+1)−1
又a1=15(x−1)a1=15(x−1)代入可得:
an=(45)n−1(15(x−1)+1)−1an=(45)n−1(15(x−1)+1)−1⇔an=4n−15n(x+4)−1⇔an=4n−15n(x+4)−1
因为anan为整数,所以x+4x+4是5n5n的倍数。要取xx最小,令x+4=5nx+4=5n,得:
x=5n−4x=5n−4
即为所求的总的桃子数。
所有小猴子分得的桃子数
所有小猴子分得的桃子数:
∑i=1nai∑i=1nai⇔∑i=1n((45)i−1(ai+1)−1)⇔∑i=1n((45)i−1(ai+1)−1)⇔(ai+1)∑i=1n(45)i−1−n⇔(ai+1)∑i=1n(45)i−1−n⇔(ai+1)(1−(45)n1−45)−n⇔(ai+1)(1−(45)n1−45)−n
又,a1=15(x−1)a1=15(x−1),x=5n−4x=5n−4,得:
a1=5n−1−1a1=5n−1−1
再得:
5n−1(1−(45)n1−45)−n5n−1(1−(45)n1−45)−n⇔4∗5n−1−4n−n⇔4∗5n−1−4n−n
因此小猴子们分的桃子总数为:
5n−4n−n5n−4n−n
2.3 老猴子最后获得的桃子数
5n−4−(5n−4n−n)5n−4−(5n−4n−n)⇔4n+n−4