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;
}

猜你喜欢

转载自blog.csdn.net/qq_31038073/article/details/83473204
今日推荐