http://acm.hdu.edu.cn/showproblem.php?pid=2058
以为简单的穷举就完了,结果是一直Time Limit Exceeded。。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b;
int i,j,k;
while (scanf("%d%d",&a,&b)!=EOF&&(a!=0||b!=0))
{
for (i=1;i<=a;i++)
{
k = 0;
for (j=i;j<=i+(int)sqrt((double)(2*b))+1;j++)
{
k = k+j;
if (k == b)
printf("[%d,%d]\n",i,j);
}
}
printf("\n");
}
return 0;
}
穷举是穷举,还不能任意穷举,要不超时!
设初始值i,个数为j的数列满足要求,则(i+i+j-1)*j/2=m
==>(2*i-1+j)*j=2m
所以j肯定小于等于sqrt(2*m),穷举。
之后才发现数据量之大,然后找到了解决办法。
<span style="font-size:24px;">#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b;
int i,j,k;
while (scanf("%d%d",&a,&b)!=EOF&&a&&b)
{
for (j=(int)sqrt((double)(2*b));j>=1;j--)
{
i = (2*b/j+1-j)/2;
if (b == (2*i+j-1)*j/2)
printf("[%d,%d]\n",i,i+j-1);
}
printf("\n");
}
return 0;
}
</span>