杭电ACM2058--The sum problem

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>

 


 

 

 

 

posted @ 2015-02-04 14:19  小小暮雨  阅读(332)  评论(0编辑  收藏  举报