#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
vector<pair<int, int>> rozkazy;
int K[35];
unordered_map<string, int> memo; // Mapa do przechowywania wyników
string generujKlucz(const string& sekwencja, int pozostaleRozkazy) {
// Generuje unikalny klucz na podstawie sekwencji żołnierzy i liczby pozostałych rozkazów
return sekwencja + "_" + to_string(pozostaleRozkazy);
}
void czy_mozna_stworzyc(string sekwencja, int k, reverse_iterator<vector<pair<int, int>>::iterator> it, int liczbaRozkazow) {
string klucz = generujKlucz(sekwencja, liczbaRozkazow);
if (memo.find(klucz) != memo.end()) { // Sprawdza, czy wynik dla tego klucza jest już obliczony
K[k] += memo[klucz];
return;
}
if(it == rozkazy.rend()){
K[k]++;
memo[klucz] = 1; // Zapisuje wynik do memo
return;
}
int T = it->first - 1 ,F = it->second - 1;
string pom = sekwencja;
if(sekwencja[T] == '1' && sekwencja[F] == '0')
swap(pom[T],pom[F]);
// Próbuje wykonania rozkazu i przechodzi dalej
czy_mozna_stworzyc(pom, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów
// Sprawdza możliwość bez wykonania rozkazu, jeśli T i F różnią się stanami
if (sekwencja[T] != sekwencja[F])
czy_mozna_stworzyc(sekwencja, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów
// Memoizacja wyniku nie jest bezpośrednio zastosowana tutaj do zapisywania wyniku
// ponieważ aktualizujemy K[k] w trakcie wykonywania funkcji.
// Kluczowe jest zapisywanie wyniku dla końcowych konfiguracji.
}
void generateSequences(int n) {
for (int k = 1; k <= n; ++k) {
string sequence(n, '0');
for (int j = 0; j < k; ++j) {
sequence[j] = '1';
}
czy_mozna_stworzyc(sequence, k, rozkazy.rbegin(), rozkazy.size());
}
}
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
int n,m;
cin>>n>>m;
rozkazy.reserve(m);
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
rozkazy.emplace_back(a,b);
}
generateSequences(n);
for(int i=1;i<=n;i++){
cout<<K[i]%2<<" ";
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <iostream> #include <vector> #include <unordered_map> using namespace std; vector<pair<int, int>> rozkazy; int K[35]; unordered_map<string, int> memo; // Mapa do przechowywania wyników string generujKlucz(const string& sekwencja, int pozostaleRozkazy) { // Generuje unikalny klucz na podstawie sekwencji żołnierzy i liczby pozostałych rozkazów return sekwencja + "_" + to_string(pozostaleRozkazy); } void czy_mozna_stworzyc(string sekwencja, int k, reverse_iterator<vector<pair<int, int>>::iterator> it, int liczbaRozkazow) { string klucz = generujKlucz(sekwencja, liczbaRozkazow); if (memo.find(klucz) != memo.end()) { // Sprawdza, czy wynik dla tego klucza jest już obliczony K[k] += memo[klucz]; return; } if(it == rozkazy.rend()){ K[k]++; memo[klucz] = 1; // Zapisuje wynik do memo return; } int T = it->first - 1 ,F = it->second - 1; string pom = sekwencja; if(sekwencja[T] == '1' && sekwencja[F] == '0') swap(pom[T],pom[F]); // Próbuje wykonania rozkazu i przechodzi dalej czy_mozna_stworzyc(pom, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów // Sprawdza możliwość bez wykonania rozkazu, jeśli T i F różnią się stanami if (sekwencja[T] != sekwencja[F]) czy_mozna_stworzyc(sekwencja, k, next(it), liczbaRozkazow - 1); // Zmniejsza liczbę pozostałych rozkazów // Memoizacja wyniku nie jest bezpośrednio zastosowana tutaj do zapisywania wyniku // ponieważ aktualizujemy K[k] w trakcie wykonywania funkcji. // Kluczowe jest zapisywanie wyniku dla końcowych konfiguracji. } void generateSequences(int n) { for (int k = 1; k <= n; ++k) { string sequence(n, '0'); for (int j = 0; j < k; ++j) { sequence[j] = '1'; } czy_mozna_stworzyc(sequence, k, rozkazy.rbegin(), rozkazy.size()); } } int main() { cin.tie(0); ios::sync_with_stdio(0); int n,m; cin>>n>>m; rozkazy.reserve(m); for(int i=0;i<m;i++){ int a,b; cin>>a>>b; rozkazy.emplace_back(a,b); } generateSequences(n); for(int i=1;i<=n;i++){ cout<<K[i]%2<<" "; } return 0; } |
English