hdu 1868

http://acm.hdu.edu.cn/showproblem.php?pid=1868

没想出来盗用别人的思路:

如:15 = 1+2+3+4+5 = 4+5+6 = 7+8,结果为3。设n可以表示成i个连续整数之和,首项为a,则n=a+(a+1)+……(a+i-1)=i*a+(1+2+……+(i-1))=i*a+(i*(i-1)/2)-->a=(n-(i*(i-1)/2))/i 所以我们可以按当前程度i从可能的最大长度k到2(若15=15也算则到1)去试,若能求得首项为整数(可以通过是否能整除判断),则可以表示成i个整数之和。

#include"stdio.h"


int main( )
{
  int n,i,max,count;
  __int64 sum;
  double a;
  while(~scanf("%d",&n))
  {
    sum=0;
    for(i=1;i<=n;i++)//找出最多有多少个项连续的和;
    {
      sum+=i;
      if(sum>n)
        break;
    }
    max=i-1;sum=count=0;
    for(i=2;i<=max;i++)
    {
      a=(n-(i*(i-1))/2.0)/(i*1.0);//看首项是否存在;
      if((int)(a+0.5)==a)
      count++;
    }
    printf("%d\n",count);
  }
return 0;
}

posted @ 2012-05-21 00:05  朝圣の路  阅读(125)  评论(0编辑  收藏  举报