The sum problem
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20343 Accepted Submission(s): 5979
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]
题解:思路很简单,就是小于m中枚举长度n. 可以这么看:
x+(x+1)+(x+2)+(x+3)……+(x+n)=m;
设sn=(0+1+2+3+……+n),贴个0就不须要单独处理1的情况了!
则 x=(m-sn)/(1+n) 然后再看下x是否为整形的。 如果 m>sn就可以跳出循环了。
这里写代码片
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int a[10000],b[10000];
int main()
{
int n,m;
while(cin>>n>>m,(n+m))
{
double ans,sum=0;
int k=0;
a[k]=m,b[k++]=m;
for(int i=1;i<=m;i++)
{
sum=i*(i+1)/2;
ans=(double)(m-sum)/(1+i);
if(m>sum)
{
if(ans==(int)ans)
{
a[k]=ans,b[k++]=ans+i;
}
}
else
break;
}
for(int i=k-1;i>=0;i--)
cout<<"["<<a[i]<<","<<b[i]<<"]"<<endl;
cout<<endl;
}
return 0;
}