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;
}