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 ",ans);

  }

  return 0;

}

原文地址:https://www.cnblogs.com/20143605--pcx/p/4672577.html