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;
}