Cod sursa(job #217743)
#include<iostream.h>
#include <math.h>
typedef int stiva[100];
int n,m,k,ev,as;
stiva st;
void init ()
{st[k]=0;}
int succesor ()
{if (st[k]<n)
{st[k]=st[k]+1; return 1;}
else return 0;
}
int valid ()
{int i;
if (k>1 && st[k]<st[k-1]) return 0;
for (i=1;i<k;i++)
if (st[k]==st[i]) return 0;
return 1;
}
int solutie()
{return k==m;}
void tipar ()
{int i;
for (i=1;i<=m;i++) cout<<st[i]<<" ";
cout<<endl;
}
void bt() //partea fixa a algoritmului
{k=1;
init();
while (k>0)
{as=1; ev=0;
while(as && !ev)
{as=succesor();
if(as) ev=valid();}
if(as)
if (solutie()) tipar();
else {k++; init();}
else k--;}
}
int main()
{freopen("combinari.in","r",stdin);
freopen("combinari.out","w",stdout);
cin>>n;
cin>>m;
bt();
return 0;
}