The sum problem
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22620 Accepted Submission(s): 6691
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
刚开始我直接用的暴力,然后直接超时,去网上看了一下他们的代码,发现是个数学题。
是对公式的变形,对数学基础的考察。
等差数列的运用。S
n = (a
1+a
n) * n / 2 = (a
1 + a
1 + (n - 1) * d)*n/2。
解题公式变形:(a+a+len)*(len+1)/2 = m => a = m/(len+1)-len/2 (m是已知条件,len的最大值为sqrt(2*m))。
在这里声明一下:公差是1,由求和公式得Sn = (a1+an) * n / 2;所以说n最大就是sqrt(M*2),因为a1=1 an=n n趋向无穷大时1就可以忽略了,所以n最大就是sqrt(M*2)。
#include <stdio.h>
#include <math.h>
int main()
{
int n,m,len,a;
while(~scanf("%d%d",&n,&m),(n||m))
{
len=(int )sqrt(2*m);
while(len--)
{
a=m/(len+1)-len/2;
if((2*a+len)*(len+1)/2==m)
printf("[%d,%d]\n",a,a+len);
}
printf("\n");
}
return 0;
}