//博主mingliang37的思想,我后来想明白了,整理了一下.
#include <iostream>
using namespace std;
//输出所有和为S的连续整正数序列.
//x.......y(这是一个连续序列)
//x+.....+y=S;
//还记得小时候老师要我们做的一道题吗?求1+2+3+...+100=?
//(1+100).100/2=5050.
//所以我们假设这个连续正整数序列是从x开始到y结束,总共有n个数字
//那么S=(x+y)*n/2,且y-x=n-1;
//1----------S=(x+y)*n/2.
//2----------y-x=n-1;
//(2x+n-1)*n/2=S
//2S/n+1-n=2x
//2S+n-n*n=2n*x
//x=(2S+n+n*n)/2n--->这是x序列开始位置,用n(序列长度)来替换x。
//因为x>0,所以2S+n-n*n>0;
void Grial(int sum)
{
for(int i=1;i<sum;i++)
{
int S=2*sum+i-i*i;//下面的所有推算都是由公式.i是边的长度.
//2S+n+n*n=2*n*x及x>0得到.
//边(n)=(2S+n+n*n)%(2*x)==0时表示从x位置开始有整数长度的n可以满足要求.
//如果!=0则表示该位置不满足要求,i++,继续开始.
if(S<0)
break;
if(S%(2*i)!=0)
{
continue;
}
int x=S/(2*i);
for(int j=0;j<i;j++)
{
cout<<x+j<<" ";
}
cout<<endl;
}
}
int main()
{
Grial(100);
return 0;
}