hdu 2058 The sum problem

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

观察a+1,a+2…a+d全部相加等于m即(a+1+a+d)*d/2 = m,这里d是平方,我们可以从长度d入手,当a+1,a+2…a+3相加等于m时,即(a+1+a+d)*d/2 = m而a最小是0,所以(d+1)*d/2=m时d去最大值,就是这步把时间复杂度减小的。d就是sqrt(2*m),(a+1+a+d)*d/2 = m,所以a*d + (d+1)*d/2 = m,所以要使等式成立,m-(d+1)*d/2必须是d的倍数。

代码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

int main()

{

    int n,m,a,d;

    while(scanf("%d%d",&n,&m),n&&m)

    {

           d=(int)sqrt(2.0*m);

           for(int i=d;i>=1;--i)

           {

                   int t=m-i*(i+1)/2;

                   if(t%i==0)

                   printf("[%d,%d]\n",t/i+1,t/i+i);

           }

           puts("");

    }

    //system("pause");

    return 0;

}

原文地址:https://www.cnblogs.com/yuelingzhi/p/2132417.html