The sum problem
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15381 Accepted Submission(s): 4620
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
Recommend
思路:
先确定一段和sum=m的最长的长度,要最长则起点从1开始,根据等差求和,len*(len+1)/2=m;放缩法则len^2<2*m,所以len=pow(2.0*m,0.5);现在根据长度确定起点L,根据等差求和公式,((len+L-1)+L)*len/2=m; => L=(2*m/len+1-len)/2; 判断时反代上式是否成立,是则输出[L,L+len-1。
ac代码
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF,n||m)
{
//int len=sqrt((double)2*m);
int len=(int)pow(2.0*m,0.5);
if(len>n)
len=n;
for(;len>=1;len--)
{
int l=(2*m/len-len+1)/2;
if(((len-1+l)+l)*len/2==m)
printf("[%d,%d]\n",l,len+l-1);
}
printf("\n");
}
}