#include <iostream> #include <set> #include <vector> using namespace std; vector<pair<int,int>> rozkazy; int K[35]; string wczesniejsza_sekwencja(string sekwencja,int T, int F){ string pom = sekwencja; if(sekwencja[T] == '1' && sekwencja[F] == '0') swap(pom[T],pom[F]); return pom; } void czy_mozna_stworzyc(string sekwencja, int k, reverse_iterator<vector<pair<int, int>>::iterator> it){ if(it == rozkazy.rend()){ K[k]++; return; } int T = it->first - 1 ,F =it->second - 1; if(wczesniejsza_sekwencja(sekwencja,T,F) == sekwencja) czy_mozna_stworzyc(sekwencja,k,next(it)); if(sekwencja[T]==sekwencja[F]) return; string pom = sekwencja; swap(sekwencja[T],sekwencja[F]); if(wczesniejsza_sekwencja(sekwencja,T,F) == pom) czy_mozna_stworzyc(sekwencja,k,next(it)); } void generateSequences(int n) { for (int k = 2; k <= n-1; ++k) { // Przechodzi przez wszystkie możliwe pozycje bloku "k" jedynek for (int start = 0; start <= n - k; ++start) { string sequence(n, '0'); // Tworzy ciąg "0" o długości "n" // Umieszcza blok "k" jedynek w odpowiedniej pozycji for (int j = start; j < start + k; ++j) { sequence[j] = '1'; } // Wypisuje wygenerowany ciąg czy_mozna_stworzyc(sequence,k,rozkazy.rbegin()); } } } int main() { cin.tie(0); ios::sync_with_stdio(0); int n,m; cin>>n>>m; for(int i=0;i<m;i++){ int a,b; cin>>a>>b; rozkazy.emplace_back(a,b); } generateSequences(n); K[1] = n; K[n] = 1; 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 | #include <iostream> #include <set> #include <vector> using namespace std; vector<pair<int,int>> rozkazy; int K[35]; string wczesniejsza_sekwencja(string sekwencja,int T, int F){ string pom = sekwencja; if(sekwencja[T] == '1' && sekwencja[F] == '0') swap(pom[T],pom[F]); return pom; } void czy_mozna_stworzyc(string sekwencja, int k, reverse_iterator<vector<pair<int, int>>::iterator> it){ if(it == rozkazy.rend()){ K[k]++; return; } int T = it->first - 1 ,F =it->second - 1; if(wczesniejsza_sekwencja(sekwencja,T,F) == sekwencja) czy_mozna_stworzyc(sekwencja,k,next(it)); if(sekwencja[T]==sekwencja[F]) return; string pom = sekwencja; swap(sekwencja[T],sekwencja[F]); if(wczesniejsza_sekwencja(sekwencja,T,F) == pom) czy_mozna_stworzyc(sekwencja,k,next(it)); } void generateSequences(int n) { for (int k = 2; k <= n-1; ++k) { // Przechodzi przez wszystkie możliwe pozycje bloku "k" jedynek for (int start = 0; start <= n - k; ++start) { string sequence(n, '0'); // Tworzy ciąg "0" o długości "n" // Umieszcza blok "k" jedynek w odpowiedniej pozycji for (int j = start; j < start + k; ++j) { sequence[j] = '1'; } // Wypisuje wygenerowany ciąg czy_mozna_stworzyc(sequence,k,rozkazy.rbegin()); } } } int main() { cin.tie(0); ios::sync_with_stdio(0); int n,m; cin>>n>>m; for(int i=0;i<m;i++){ int a,b; cin>>a>>b; rozkazy.emplace_back(a,b); } generateSequences(n); K[1] = n; K[n] = 1; for(int i=1;i<=n;i++) cout<<K[i]%2<<" "; return 0; } |