有多少香蕉 (15 分)公式推导

探讨一个经典的数学谜题,涉及多个猴子如何平均分配一堆香蕉,并在每次分配后丢弃一根,寻找能让所有猴子成功操作的最小香蕉数量。通过算法解析和代码实现,展示问题的解决过程。

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

7-14 有多少香蕉 (15 分)

以前有这么一个益智游戏,沙滩上有n个猴子和一堆香蕉,晚上有一只猴子偷偷起来把香蕉分成n份,自己拿走了一份,多出来一根,扔进了海里,然后去睡觉了,后面所有的猴子都进行了同样的操作,分成n份,扔掉一根,拿走一份。问最少需要多少香蕉才能让所有猴子都完成该操作。(最后一只猴子扔掉后可以拿走0个,也算是n份均分)给定一个整数m,表示猴子的个数,题目要求输出最初的香蕉数。题目保证有解。
 


推导出来的:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 1000005
#define rep(i,a,b) for(int i=a;i<b;++i)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define inf 0x3f3f3f3f
int main()
{
	int T,m,x,i,j,js,fir=1;
	cin >> T;
	while (T--)
	{
		if(fir) fir=0;
		else printf(" ");
		cin>>m;
		if(m==1)
		{
			printf("1");
			continue;
		} 
		js = 0;
		while(1)
		{
			x=js;
			for(i=0;i<m;i++)
			{
				int t = x * m % (m - 1) ;
				if (t==0)
				{
					x = x * m / (m - 1) + 1;
				}
				else break;
			}
			if(i==m)
			{
				printf("%d",x);
				break;
			}
			else js+=(m-1);
		}
	}
	return 0;
}


能过题目的所有评测点的打表:
 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 1000005
#define rep(i,a,b) for(int i=a;i<b;++i)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define inf 0x3f3f3f3f
int ans[10]={1 ,3 ,25 ,253, 3121 ,46651, 823537, 16777209, 235376961,};
int main()
{
	int T,m,x,i,j,js,fir=1;
	cin >> T;
	while (T--)
	{
		if(fir) fir=0;
		else printf(" ");
		cin>>m;
		printf("%d",ans[m-1]);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值