#include<bits/stdc++.h> using namespace std; using pii = pair<int, int>; constexpr int MAXk = (1 << 26); int d[MAXk], odp[36]; vector<pii> ru; void dodaj(int &kon, int val) { kon += val; if(kon > 1) kon = 0; } void dekomp(int n, vector<bool> &l, int w) { l.clear(); while(n) { l.push_back(n%2); n /= 2; } while(l.size() != w) l.push_back(0); reverse(l.begin(), l.end()); } int komp(vector<bool> &l, int &ile1) { int res = 0; int n = 0; while(l.size()) { if(l.back()) ile1++; res += (l.back() << n); n++; l.pop_back(); } return res; } void oblicz(int n, int m) { vector<bool> l; for(int i = 0; i < (1 << n); ++i) { dekomp(i, l, n); for(auto &[a, b] : ru) { if(l[a-1] == 1) swap(l[a-1], l[b-1]); } int ile1 = 0; int al = komp(l, ile1); //cerr << "AL: " << al << '\n'; dodaj(d[al], 1); } } void zlicz(int n) { for(int i = 0; i < n; ++i) { int ki = 1 << i; int ile1 = 1; dodaj(odp[ile1], d[ki]); for(int x = i+1; x < n; ++x) { ki += (1 << x); ile1++; //cerr << ki << ' ' << ile1 << ' ' << d[ki] << '\n'; dodaj(odp[ile1], d[ki]); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; for(int i = 0; i < m; ++i) { int a, b; cin >> a >> b; ru.emplace_back(a, b); } oblicz(n, m); zlicz(n); for(int i = 1; i <= n; ++i) cout << odp[i] << ' '; }
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 77 78 79 80 81 82 | #include<bits/stdc++.h> using namespace std; using pii = pair<int, int>; constexpr int MAXk = (1 << 26); int d[MAXk], odp[36]; vector<pii> ru; void dodaj(int &kon, int val) { kon += val; if(kon > 1) kon = 0; } void dekomp(int n, vector<bool> &l, int w) { l.clear(); while(n) { l.push_back(n%2); n /= 2; } while(l.size() != w) l.push_back(0); reverse(l.begin(), l.end()); } int komp(vector<bool> &l, int &ile1) { int res = 0; int n = 0; while(l.size()) { if(l.back()) ile1++; res += (l.back() << n); n++; l.pop_back(); } return res; } void oblicz(int n, int m) { vector<bool> l; for(int i = 0; i < (1 << n); ++i) { dekomp(i, l, n); for(auto &[a, b] : ru) { if(l[a-1] == 1) swap(l[a-1], l[b-1]); } int ile1 = 0; int al = komp(l, ile1); //cerr << "AL: " << al << '\n'; dodaj(d[al], 1); } } void zlicz(int n) { for(int i = 0; i < n; ++i) { int ki = 1 << i; int ile1 = 1; dodaj(odp[ile1], d[ki]); for(int x = i+1; x < n; ++x) { ki += (1 << x); ile1++; //cerr << ki << ' ' << ile1 << ' ' << d[ki] << '\n'; dodaj(odp[ile1], d[ki]); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; for(int i = 0; i < m; ++i) { int a, b; cin >> a >> b; ru.emplace_back(a, b); } oblicz(n, m); zlicz(n); for(int i = 1; i <= n; ++i) cout << odp[i] << ' '; } |