递推之猴子分桃

本文介绍了一个关于猴子分桃的问题,涉及到递归算法。每只猴子将桃子分成五等份,多出一个留给老猴子,求初始桃子数量及老猴子最后最少能得多少个桃子。通过数学分析得出,当n=5时,初始桃子数至少为3121,老猴子最少得到1025个桃子。对于n只猴子的情况,桃子数和老猴子所得遵循特定的数学规律。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

猴子分桃

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。

第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。

第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。

这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。

Input

输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤10)。
输入以0结束,该行不做处理。

Output

每组测试数据对应一行输出。
包括两个整数a,b。
分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。

Sample Input

5
1
0

Sample Output

3121 1025
1 1

Hint

Source

ZJGSU
解题思路:(此处的思路是转载的)
设x个桃子,因为第一只猴子拿一个给老猴子,正好可以分成5堆,所以,(x-1)mod5=0,那么, (x+4)mod5=0。

让我们做点好事,借给猴子们4个桃子,反正最后剩一大堆,我们可以让老猴子还我们4个,呵呵,还可以收利哦。

我们借给猴子4个桃子,那么正好可以分成5堆,第一个猴子就拿了其中一堆(包括老猴子的一个)。但是,它并没有多得桃子(我们给的桃子他并没有多拿,只是拿走了本属于老猴子的桃子)。就是(x+4)(1/5)=(x-1)(1/5)+1,
因为它没有多得,所以剩下的桃子比原来剩下的多4个(我们借给它们的4个桃子)。那么剩下的桃子同理也恰好可以分成5堆,第二只猴子又拿走了一堆(同样,包括老猴子的一个),同理,第三,第四和第五。

假设n=5,最后,剩下的桃子是(x+4)(4/5)(4/5)(4/5)(4/5)(4/5)=(x+4)(4/5)^5,这应该是个整数,所以,(x+4)一定要能被5^5=3125整除,所以x+4最小是3125,此时,x为3121。

继续讨论:如果是n只猴子按照上述方法分桃 了,那么剩下的桃子是(x+4)(4/5)(4/5)(4/5)(4/5)(4/5)……=(x+4)*(4/5)^n,这应该是个整数,所以,(x+4)一定要能被5^n整除,所以x+4最小是5^n,此时,x为5^n-4。

因此可以知道老猴子得到了 n+(x+4)*(4/5)^n -4,因为每个猴子都给老猴子一个,在剩下的桃子中,又必须还我们四个。呵呵 到收利息的时候了哦!

特别说明:网上很多关于5个猴子分桃子的结果,都是错误的,正确答案是3121个桃子

程序:

(1)说明:当只有一个猴子时,该猴子得不到桃子,至少有桃子数为1,即为老猴子所得。
代码片:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int num;
int old_num;
void getpeach(int n);
int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        getpeach(n);
    }
    return 0;
}
void getpeach(int n)
{
    if(n==1)
    {
        num=1;
        old_num=1;
    }
    else
    {
        num=pow(5,n)-4;//这个函数是5的N次方,要用头文件include<math.h>
        old_num=n+(num+4)*pow(0.8,n)-4;
    }
    printf("%d %d\n",num,old_num);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值