7E

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]

// 遍历所有子列
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int n, m, i,j, t, flag;
 5     while(scanf("%d %d", &n, &m), !(n==0&&m==0))
 6     {
 7         for(i=1;i<=n;i++)
 8         {
 9             flag=0; t=0;
10             for(j=i;j<=n;j++)
11             {
12                 t+=j;
13                 if(t==m)
14                 { flag=1; break; }
15                 if(t>m) break;
16             }
17             if(flag) printf("[%d,%d]
", i, j);
18         }
19         printf("
");
20     }
21     return 0;
22 }
Time Limit Exceeded
// 老老实实算吧
 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()
 4 {
 5     int n, m, i,j;
 6     while(scanf("%d %d", &n, &m), !(n==0&&m==0))
 7     {
 8         for(i=(int)sqrt(2.0*m);i>0;i--)    // a1*n+n*(n-1)/2=(2*a1+(n-1))*n/2=m,
 9         {                                // 又a1>=1, 则n<sqrt(2*m). 
10             j=(2*m/i-i+1)/2;            // a1=(2*m/n-n+1)/2
11             if((2*j+i-1)*i/2==m)
12                 printf("[%d,%d]
", j, i+j-1);
13         }
14         printf("
");
15     }
16     return 0;
17 }
AC
 
原文地址:https://www.cnblogs.com/goldenretriever/p/10357103.html