设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 problemTime 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.
扫描二维码关注公众号,回复:
4094553 查看本文章
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 |
原题链接: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;
}