1. 程式人生 > >hdu2058(子序列的和)

hdu2058(子序列的和)

設i為子序列的起點,j為子序列的長度,由等差數列公式得:m=j*(i+i+j-1)/2;(其中i+j-1相當於序列的最後一個數an,因為公差是1); 得i = (2*m/j - j+1)/2;   

對於for(j = sqrt(2*m); j > 0; j--)

j = sqrt(2*m),(想一想為什麼)  因為對於m=j*(i+i+j-1)/2; 首相加尾相肯定是大於n的,既i + i+j-1 > j(因為i>1), 所以j最大sqrt(2*m)

The sum problem

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


 

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

原題連結:http://acm.hdu.edu.cn/showproblem.php?pid=2058

AC程式碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n, m, i, j;
    while(scanf("%d%d", &n, &m) && (n||m))
    {
        for(j = sqrt(2*m); j > 0; j--)
        {
            i = (2*m/j - j + 1)/2;
            if(j*(2*i+j-1)/2 == m)
            {
                printf("[%d,%d]\n", i, i+j-1);
            }
        }
        printf("\n");
    }

    return 0;
}