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