/*The sum problem
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15619 Accepted Submission(s): 4692
Problem Description
Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the sum of the sub-sequence is M.
Input
Input contains multiple test cases. each case contains two integers N, M( 1 <= N, M <= 1000000000).input ends with N = M = 0.
Output
For each test case, print all the possible sub-sequence that its sum is M.The format is show in the sample below.print a blank line after each test case.
Sample Input
20 10
50 30
0 0
Sample Output
[1,4]
[10,10]
[4,8]
[6,9]
[9,11]
[30,30]
Author
8600
Source
校庆杯Warm Up
*/
#include<stdio.h>
#include<math.h>
int main()
{
__int64 i, j, m, n, sum, k;
while(scanf("%I64d%I64d", &n, &m) != EOF && (m || n))
{
n = m < n?m:n;
for( k = sqrt(2*m) ; k >= 1; k--)
{
i = (2 * m / k + 1 - k)/2;
if((2*i + k - 1) * k == 2*m)
printf("[%I64d,%I64d]\n",i, i+k-1);
}
printf("\n");
}
return 0;
}
题意:给出一区间, 求区间内任意子区间的连续数字的和。若符合则输出区间。
思路:用求和公式 ,以i为起点, k 为区间长度,则和为 (2*i +k-1)*k/2 。以k为变量,求出i,若是整数则求和与m相等,否则不等,判断是否与m相等,相等则输出区间。
关键:区间长度 k应当适当的缩小,减少时间。
难点:要知道该求和公式,并以区间长度为变量进行求值。