#include <fstream>
using namespace std;
ifstream fin("combinari.in");
ofstream fout("combinari.out");
//varianta 2
int n, m, x[16];
void prelsol()
{
for(int i = 1; i <= m; i++)
fout << x[i] << ' ';
fout << '\n';
}
/*************************
x [ k - 1 ] + 1 = cea mai mica valoare care poate fi pusa pe pozitia k
n - m + k = cea mai mare valoare care poate fi pusa pe pozitia k
**/
void bt(int k)
{
if(k <= m)
for(int i = x[k - 1] + 1; i <= n - m + k; i++)
{
x[k] = i;
bt(k + 1);
}
else
prelsol();
}
int main()
{
fin >> n >> m;
///x[0]=0; //artificiu pentru (*) cand k=1
bt(1);
fin.close();
fout.close();
return 0;
}
//varianta 1
/**
int n, m, x[16];
void prelsol()
{
for(int i = 1; i <= m; i++)
fout << x[i] << ' ';
fout << '\n';
}
void bt(int k)
{
if(k <= m)
for(int i = x[k - 1] + 1; i <= n; i++)
{
x[k] = i;
bt(k + 1);
}
else
prelsol();
}
int main()
{
fin >> n >> m;
///x[0]=0; //artificiu pentru (*) cand k=1
bt(1);
fin.close();
fout.close();
return 0;
}
**/
//varianta 0
/**
int n, m, x[16];
bool valid(int k)
{
return (x[k - 1] < x[k]); ///(*)
}
void prelsol()
{
for(int i = 1; i <= m; i++)
fout << x[i] << ' ';
fout << '\n';
}
void bt(int k)
{
if(k <= m)
for(int i = 1; i <= n; i++)
{
x[k] = i;
if(valid(k))
bt(k + 1);
}
else
prelsol();
}
int main()
{
fin >> n >> m;
///x[0]=0; //artificiu pentru (*) cand k=1
bt(1);
fin.close();
fout.close();
return 0;
}
**/