Hduoj2058 【数学】【水题】

/*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应当适当的缩小,减少时间。

难点:要知道该求和公式,并以区间长度为变量进行求值。

你可能感兴趣的:(c)