HDU2058

The sum problem

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20726    Accepted Submission(s): 6100

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

Recommend

linle   |   We have carefully selected several similar problems for you:  20592062206020722061

Statistic | Submit | Discuss | Note

 

这道题显然不可能直接暴力做出来。技巧在于所有可能数列的长度有最大值。设数列为a+1,a+2 ,…… a+len,则它的长度为len。

根据公式M=[(a+1)+(a+len)]*len/2化简得出M*2=len*len+(2a+1)*len。所以len一定小于sqrt(2*M)接下来就可以枚举lenAC这道题。

 

 

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main()
 5 {
 6     int N, M;
 7     while(~scanf("%d%d", &N, &M)) {
 8         if(M == 0 && N == 0) break;
 9         int len = sqrt(double(M * 2));//如果不加double会出现编译错误,sqrt的参数是浮点型的。
10         while(len) {
11             int a = M / len - (1 + len) / 2;
12             if((a + 1 + a + len) * len / 2 == M) printf("[%d,%d]\n", a + 1, a + len);
13             len--;
14         }
15         puts("");
16     }
17     return 0;
18 }
View Code

 

 

 

你可能感兴趣的:(HDU2058)