#pragma GCC optimize ("O3")
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (b); i >= (a); i--)
#define SZ(x) ((int)x.size())
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define st first
#define nd second
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
auto &operator<<(auto &o, pair<auto, auto> p) {
return o << "(" << p.st << ", " << p.nd << ")";
}
auto operator<<(auto &o, auto x)->decltype(end(x), o) {
o << "{"; int i=0; for(auto e: x) o << ", " + 2*!i++ << e;
return o << "}";
}
#define deb(x...) cerr << "[" #x "]: ", [](auto...$) { ((cerr<<$<<"; "),...) << endl; }(x)
const int nax = 1005;
int from[nax];
int to[nax];
int n, m;
vector<int> cnt, cnt2;
ll ans[nax];
void brucik(){
cnt.resize(1 << n, 0); cnt2 = cnt;
rep(i, 1, (1 << n) - 1) cnt[i] = 1;
rep(r, 1, m){
int x = from[r] - 1;
int y = to[r] - 1;
rep(mask, 0, (1 << n) - 1) cnt2[mask] = 0;
rep(mask, 0, (1 << n) - 1){
if((mask & (1 << x)) && (!(mask & (1 << y)))){
cnt2[mask ^ (1 << x) ^ (1 << y)] += cnt[mask];
}
else cnt2[mask] += cnt[mask];
}
swap(cnt, cnt2);
}
rep(i, 1, n){
rep(j, i, n){
int mask = 0;
rep(k, i, j) mask ^= (1 << (k - 1));
ans[j - i + 1] += cnt[mask];
}
}
rep(i, 1, n) cout << ans[i] % 2 << " ";
cout << "\n";
exit(0);
}
bitset<40> emp;
void go(vector<bitset<40>> jazda){
vector<bitset<40>> alive, nxt;
alive = jazda;
nxt.clear();
per(i, 1, m){
int x = from[i];
int y = to[i];
for(auto cur : alive){
if(cur[x] == 0 && cur[y] == 1){
nxt.pb(cur);
auto cp = cur;
cp[x] = 1;
cp[y] = 0;
nxt.pb(cp);
}
else if(cur[x] == 1 && cur[y] == 0){
continue;
}
else{
nxt.pb(cur);
}
}
swap(alive, nxt);
nxt.clear();
}
ans[jazda[0].count()] += SZ(alive);
}
void solve(){
cin >> n >> m;
rep(i, 1, m) cin >> from[i] >> to[i];
if((1LL << n) * m <= 1024LL * 1024 * 1000){
brucik();
}
emp.reset();
rep(len, 1, n){
vector<bitset<40>> jazda;
rep(i, 1, n - len + 1){
auto akt = emp;
rep(j, i, i + len - 1) akt[j] = true;
jazda.pb(akt);
}
go(jazda);
}
rep(i, 1, n) cout << ans[i] % 2 << " ";
cout << "\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int tt = 1;
// cin >> tt;
rep(te, 1, tt) solve();
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #pragma GCC optimize ("O3") #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = (a); i <= (b); i++) #define per(i, a, b) for (int i = (b); i >= (a); i--) #define SZ(x) ((int)x.size()) #define all(x) x.begin(), x.end() #define pb push_back #define mp make_pair #define mt make_tuple #define st first #define nd second using ll = long long; using vi = vector<int>; using pii = pair<int, int>; using pll = pair<ll, ll>; auto &operator<<(auto &o, pair<auto, auto> p) { return o << "(" << p.st << ", " << p.nd << ")"; } auto operator<<(auto &o, auto x)->decltype(end(x), o) { o << "{"; int i=0; for(auto e: x) o << ", " + 2*!i++ << e; return o << "}"; } #define deb(x...) cerr << "[" #x "]: ", [](auto...$) { ((cerr<<$<<"; "),...) << endl; }(x) const int nax = 1005; int from[nax]; int to[nax]; int n, m; vector<int> cnt, cnt2; ll ans[nax]; void brucik(){ cnt.resize(1 << n, 0); cnt2 = cnt; rep(i, 1, (1 << n) - 1) cnt[i] = 1; rep(r, 1, m){ int x = from[r] - 1; int y = to[r] - 1; rep(mask, 0, (1 << n) - 1) cnt2[mask] = 0; rep(mask, 0, (1 << n) - 1){ if((mask & (1 << x)) && (!(mask & (1 << y)))){ cnt2[mask ^ (1 << x) ^ (1 << y)] += cnt[mask]; } else cnt2[mask] += cnt[mask]; } swap(cnt, cnt2); } rep(i, 1, n){ rep(j, i, n){ int mask = 0; rep(k, i, j) mask ^= (1 << (k - 1)); ans[j - i + 1] += cnt[mask]; } } rep(i, 1, n) cout << ans[i] % 2 << " "; cout << "\n"; exit(0); } bitset<40> emp; void go(vector<bitset<40>> jazda){ vector<bitset<40>> alive, nxt; alive = jazda; nxt.clear(); per(i, 1, m){ int x = from[i]; int y = to[i]; for(auto cur : alive){ if(cur[x] == 0 && cur[y] == 1){ nxt.pb(cur); auto cp = cur; cp[x] = 1; cp[y] = 0; nxt.pb(cp); } else if(cur[x] == 1 && cur[y] == 0){ continue; } else{ nxt.pb(cur); } } swap(alive, nxt); nxt.clear(); } ans[jazda[0].count()] += SZ(alive); } void solve(){ cin >> n >> m; rep(i, 1, m) cin >> from[i] >> to[i]; if((1LL << n) * m <= 1024LL * 1024 * 1000){ brucik(); } emp.reset(); rep(len, 1, n){ vector<bitset<40>> jazda; rep(i, 1, n - len + 1){ auto akt = emp; rep(j, i, i + len - 1) akt[j] = true; jazda.pb(akt); } go(jazda); } rep(i, 1, n) cout << ans[i] % 2 << " "; cout << "\n"; } int main() { ios::sync_with_stdio(0); cin.tie(0); int tt = 1; // cin >> tt; rep(te, 1, tt) solve(); return 0; } |
English