UVA-10726 Coco Monkey(递推)
题目大意:n个人,m个猴子分桃,第一个人把桃子分成n份余下m个,第一个人将余下的给猴子,拿走自己的那份。第二个人把剩下的桃子也分成n份,余下m个,将余下的分给猴子,拿走自己的那份。………… 直到n个人如此做完之后,剩下的桃子数正好是能被n个人平分。求在区间[l,r]中,有几个值可能是原来的桃子数。
题目解析:最后剩下的桃子数一定是n*(n-1)的倍数,枚举即可。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
using namespace std;
double f(int u,int s,int m)
{
double uu=(double)u;
for(int i=1;i<=s;++i){
uu=uu*s/(s-1)+m;
}
return uu;
}
bool is(double n)
{
int a=(int)n;
return n==(double)a;
}
int main()
{
int i,s,m,a,b,T,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&s,&m,&a,&b);
printf("Case %d: ",++cas);
int u=s*(s-1);
int ans=0;
for(i=1;;++i){
double uu=f(i*u,s,m);
if(uu>=a&&uu<=b&&is(uu))
++ans;
if(uu>b)
break;
}
printf("%d\n",ans);
}
return 0;
}