http://acm.hdu.edu.cn/showproblem.php?pid=2058
题意:给出一区间, 求区间内任意子区间的连续数字的和。若符合则输出区间。
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
long long int m,n;
long long int i,j,sum;
while(scanf("%lld %lld", &n, &m) != EOF)
{
if(n==0 && m==0)
return ;
for(j=sqrt(2*m); j>=1; j--)
{
i = (2*m/j+1-j)/2;
if(j*(i+i+j-1)==2*m)
printf("[%lld,%lld]\n",i,i+j-1);
}
printf("\n");
}
return 0;
}
最开始暴力遍历求解,超时了,看了讨论自己试着推导了一下,过程如下:
设 i 是开头,j 是个数
于是,我们根据等差数列公式