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