您的位置:首页 > 其它

HDOJ 题目2058The sum problem(数学)

2014-08-23 02:10 323 查看


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

校庆杯Warm Up

 

Recommend

linle   |   We have carefully selected several similar problems for you:  2056 2062 2060 2061 2053 

 

思路:

先确定一段和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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: