#include <iostream>
using namespace std;
void __m_Partition( int n, int m ){
if( n<m ) return ;
if( m==1 ){
cout<<n<<endl; return ;
}
int *List=new int[m+1], t, s, j;
List[0]=n-m+1; List[m]=-1;
for( j=1; j<m; ++j ) List[j]=1;
while( 1 ){
for( j=0; j<m; ++j )
cout<<List[j]+m-j-1<<" ";
cout<<endl;
if( List[1]<List[0]-1 )
--List[0], ++List[1];
else{
j=2; s=List[0]+List[1]-1;
while( List[j]>=List[0]-1 )
s+=List[j], ++j;
if( j==m ) return ;
++List[j]; t=List[j--];
while( j>0 )
List[j--]=t, s-=t;
List[0]=s;
}
}
delete []List;
}
void m_Partition( int n, int m ){
n-=m*(m-1)/2;
__m_Partition( n, m );
}
int main()
{
m_Partition( 36, 5 );
return 0;
}