hdu 2058防超时解法

找一个子序列的和等于M,那么这个子序列可以看成a+1, a+2, ... , a+d 这时,d就为这个序列的长度,起始数字就是a+1,而这个序列的和即M=a*d + (1 + d) * d /2;得出d*d<2 * m,从而可以枚举d,计算出a

#include"stdio.h"
#include"math.h"
int main( )
{
__int64 n,m,d,b;
while(scanf("%I64d%I64d",&n,&m)==2&&(n!=0||m!=0))
{
for(d=sqrt(2.0*m);d>0;d--)
{
b=m-(d+d*d)/2;
if(b%d==0)
printf("[%I64d,%I64d]\n",(b/d)+1,(b/d)+d);
}
printf("\n");
}
return 0;
}

 

posted @ 2012-01-26 12:25  朝圣の路  阅读(233)  评论(0编辑  收藏  举报