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

2932MS......好险

注意:(1)n的数据范围(2)j>=i(3)开方拿出来算

因为上面三点挂了几次,勉强过关

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
__int64 n;
int t,i,p;
int cnt;
scanf("%d",&t);
while(t--)
{
scanf("%I64d",&n);
cnt=0;
p=sqrt(n);
for(i=1;i<=p;i++)
if((n-i)%(i+1)==0&&(n-i)/(i+1)>=i)
cnt++;
printf("%d\n",cnt);
}
return 0;
}

 下面是这种方法的优化版,i=j时i取得最大值,此时上限解得为sqrt(n+1)-1

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
__int64 n;
int t,i,p,cnt;
scanf("%d",&t);
while(t--)
{
scanf("%I64d",&n);
cnt=0;
p=sqrt(n+1)-1;
for(i=1;i<=p;i++)
if((n-i)%(i+1)==0)
cnt++;
printf("%d\n",cnt);
}
return 0;
}