Cerința
Fie n un număr natural nenul, mulțimea A={1,2,3,...,n} și un număr m, 1 ≤ m ≤ n. Să se determine toate partițiile disjuncte ale mulțimii A, formate din exact m submulțimi.
O partiție a mulțimii A este formată din k (1 ≤ k ≤ n) submulțimi disjuncte ale lui A: A1, A2, …, Ak cu proprietatea că A=A1U A2 U...U Ak.
Date de intrare
Fișierul de intrare pm.in conține pe prima linie numere n m.
Date de ieșire
Fișierul de ieșire pm.out va conține câte o linie pentru fiecare partiție determinată. Submulțimile vor fi separate în fiecare linie cu ajutorul caracterului *, iar elementele fiecărei submulțimi se vor scrie fără spațiere, ca în exemplul de mai jos.
Restricții și precizări
1 ≤ m ≤ n ≤ 9- Partițiile determinate se vor afișa în ordine lexicografică
Exemplu
pm.in
3 2
pm.out
12*3* 13*2* 1*23*
Explicație
Mulțimea A are 5 partiții:
{1,2,3}{1,2} U {3}{1,3} U {2}{1} U {2,3}{1} U {2} U {3}
Dintre acestea, doar ({1,2} U {3}), ({1,3} U {2}), ({1} U {2,3}) sunt formate din m=2 multimi.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("pm.in");
ofstream cout("pm.out");
int x[10], n , m;
int maxim(int k)
{
int maxi = 0;
for(int i = 1 ; i <= k ; i++)
maxi = max(x[i] , maxi);
return maxi;
}
void afisare()
{
int maxi = maxim(n);
if(maxi == m)
{
for(int i = 1 ; i <= maxi ; i++)
{
for(int j = 1 ; j <= n ; j++)
if(x[j] == i) cout << j;
cout << "*";
}
cout << '\n';
}
}
void back(int k)
{
for(int i = 1 ; i <= maxim(k - 1)+1 ; i++)
{
x[k] = i;
if(k == n) afisare();
else back(k + 1);
}
}
int main()
{
cin >> n >> m;
x[1] = 1;
back(2);
return 0;
}