#include <iostream>
#include <vector>
using namespace std;
int n, m;
const int MAX_N = 35;
const int MAX_M = 1000;
struct Rozkaz {
int a;
int b;
} rozkazy[MAX_M];
template <typename T>
ostream& operator<<(ostream& out, const vector<T>& vec) {
out << "[ ";
for (auto v: vec)
out << v << ", ";
out << "]";
return out;
}
int ile_ukladow_poczatkowych(const vector<int>& uklad_koncowy, int ile_rozkazow) {
if (ile_rozkazow == 0) {
//cout << " poczatkowy: " << uklad_koncowy << endl;
return 1;
}
int a = rozkazy[ile_rozkazow - 1].a;
int b = rozkazy[ile_rozkazow - 1].b;
if (uklad_koncowy[a] == uklad_koncowy[b]) {
return ile_ukladow_poczatkowych(uklad_koncowy, ile_rozkazow - 1);
}
if (uklad_koncowy[b] == 0) {
return 0;
}
int x = ile_ukladow_poczatkowych(uklad_koncowy, ile_rozkazow-1);
vector<int> kopia = uklad_koncowy;
kopia[a] = 1;
kopia[b] = 0;
int y = ile_ukladow_poczatkowych(kopia, ile_rozkazow-1);
return (x + y) % 2;
}
int main() {
ios_base::sync_with_stdio(0);
cin >> n >> m;
//cout << n << m << endl;
for (int j = 0; j < m; ++j) {
int a, b; cin >> a >> b;
rozkazy[j].a = a - 1;
rozkazy[j].b = b - 1;
}
for (int k = 1; k <= n; ++k) {
vector<int> uklad_koncowy(n);
for (int i = 0; i < k; ++i) {
uklad_koncowy[i] = 1;
}
int suma_ukladow_poczatkowych = 0;
for (int i = 0; i <= n - k; ++i) {
//cout << "kocowy: " << uklad_koncowy << endl;
suma_ukladow_poczatkowych += ile_ukladow_poczatkowych(uklad_koncowy, m);
if (i < n - k) {
uklad_koncowy[i] = 0;
uklad_koncowy[i + k] = 1;
}
}
cout << suma_ukladow_poczatkowych % 2 << " ";
}
cout << endl;
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 | #include <iostream> #include <vector> using namespace std; int n, m; const int MAX_N = 35; const int MAX_M = 1000; struct Rozkaz { int a; int b; } rozkazy[MAX_M]; template <typename T> ostream& operator<<(ostream& out, const vector<T>& vec) { out << "[ "; for (auto v: vec) out << v << ", "; out << "]"; return out; } int ile_ukladow_poczatkowych(const vector<int>& uklad_koncowy, int ile_rozkazow) { if (ile_rozkazow == 0) { //cout << " poczatkowy: " << uklad_koncowy << endl; return 1; } int a = rozkazy[ile_rozkazow - 1].a; int b = rozkazy[ile_rozkazow - 1].b; if (uklad_koncowy[a] == uklad_koncowy[b]) { return ile_ukladow_poczatkowych(uklad_koncowy, ile_rozkazow - 1); } if (uklad_koncowy[b] == 0) { return 0; } int x = ile_ukladow_poczatkowych(uklad_koncowy, ile_rozkazow-1); vector<int> kopia = uklad_koncowy; kopia[a] = 1; kopia[b] = 0; int y = ile_ukladow_poczatkowych(kopia, ile_rozkazow-1); return (x + y) % 2; } int main() { ios_base::sync_with_stdio(0); cin >> n >> m; //cout << n << m << endl; for (int j = 0; j < m; ++j) { int a, b; cin >> a >> b; rozkazy[j].a = a - 1; rozkazy[j].b = b - 1; } for (int k = 1; k <= n; ++k) { vector<int> uklad_koncowy(n); for (int i = 0; i < k; ++i) { uklad_koncowy[i] = 1; } int suma_ukladow_poczatkowych = 0; for (int i = 0; i <= n - k; ++i) { //cout << "kocowy: " << uklad_koncowy << endl; suma_ukladow_poczatkowych += ile_ukladow_poczatkowych(uklad_koncowy, m); if (i < n - k) { uklad_koncowy[i] = 0; uklad_koncowy[i + k] = 1; } } cout << suma_ukladow_poczatkowych % 2 << " "; } cout << endl; return 0; } |
English