由题意得:
1.输入第一个数“n”,作为首项与公差都为“1”的末项
2.输入第二个数“m”,输出序列和为“m”的所有子序列,既找到首项“a1”与项数"len"
3.由等差数列求和公式 S=n*(a1+an)/2=a1*n+n*(n-1)*d/2 得:a1*len=m-len*(len+1)/2 所以m-len*(len+1)/2与len存在倍数关系
4.m=((x+1)+(x+2)+(x+3)+……+(x+len))=(x+1+x+len)*len/2=m 所以当“x”取最小值“0”时,len最大 (1+len)*len/2=m 所以len<sqrt(2*m)
5.代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
int len=(int)(sqrt(m*2));
for(int i=len;i>=1;i--)
{
int t=m-i*(i+1)/2;
if(t%i==0)
printf("[%d,%d]\n",t/i+1,t/i+i);
}
cout<<endl;
}
return 0;
}