#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] << ' '; } |
English