#include <cstdio> #include <algorithm> #define REP(a, n) for (int a = 0; a < (n); ++a) #define FOR(a, b, c) for (int a = (b); a <= (c); ++a) #define FORD(a, b, c) for (int a = (b); a >= (c); --a) using namespace std; ////////////////////// #define X 2 int wyn[40], N, Z; int zam[2000][2]; int cur[40]; void ocen_wolna() { REP(kon, N+1) REP(pocz, kon) { bool ok = 1; REP(i, N) if (((i<pocz || i>=kon) && cur[i]==1) || (i>=pocz && i<kon && cur[i]==0)) { ok = false; break; } if (ok) wyn[kon-pocz]++; } } void ocen() { int f1=-1, l1=-1; REP(i, N) if (cur[i]==1) {f1 = i; break;} if (f1>=0) { FORD(i, N-1, 0) if (cur[i]==1) {l1 = i; break;} FOR(i, f1, l1) if (cur[i]==0) return; int len = l1-f1+1; int fX = 0, lX = 0; FORD(i, f1-1, 0) if (cur[i]==X) ++fX; else break; FOR(i, l1+1, N-1) if (cur[i]==X) ++lX; else break; if (fX<lX) swap(fX,lX); // lX jest <= fX for(int p = 0; p <= lX; p += 2) wyn[len+p]++; // += 1+p; if (lX%2==0) FOR(p, lX+1, fX) wyn[len+p]++; // += 1+lX for (int p = fX+lX; p >= fX+1; p-=2) wyn[len+p]++; // += 1+fX+lX-p; } else { int s = 0; while (s<N) { while (s<N && cur[s]==0) s++; if (s==N) break; int k = s+1; while (k<N && cur[k]==X) k++; for (int p = k-s; p>0; p -= 2) wyn[p]++; s = k; } } } void licz(int poz) { /* fprintf(stderr, "poz: %d\n", poz); REP(i, N) fprintf(stderr, "%d ", cur[i]); fprintf(stderr, "\n"); */ if (poz==Z) { ocen(); return; } if (cur[zam[poz][0]]==X && cur[zam[poz][1]]==X) { cur[zam[poz][0]] = cur[zam[poz][1]] = 0; licz(poz+1); cur[zam[poz][0]] = cur[zam[poz][1]] = 1; licz(poz+1); cur[zam[poz][0]] = X; cur[zam[poz][1]] = X; } else if (cur[zam[poz][0]]==0 || cur[zam[poz][1]]==1) { licz(poz+1); } else { swap(cur[zam[poz][0]], cur[zam[poz][1]]); licz(poz+1); swap(cur[zam[poz][0]], cur[zam[poz][1]]); } // fprintf(stderr, "return %d\n", poz); } int main() { scanf("%d%d", &N, &Z); REP(a, Z) { scanf("%d%d", &zam[a][0], &zam[a][1]); --zam[a][0]; --zam[a][1]; } REP(a, N) cur[a] = X; licz(0); REP(a, N) printf("%d%s", wyn[a+1]%2, a==N-1?" \n":" "); }
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 | #include <cstdio> #include <algorithm> #define REP(a, n) for (int a = 0; a < (n); ++a) #define FOR(a, b, c) for (int a = (b); a <= (c); ++a) #define FORD(a, b, c) for (int a = (b); a >= (c); --a) using namespace std; ////////////////////// #define X 2 int wyn[40], N, Z; int zam[2000][2]; int cur[40]; void ocen_wolna() { REP(kon, N+1) REP(pocz, kon) { bool ok = 1; REP(i, N) if (((i<pocz || i>=kon) && cur[i]==1) || (i>=pocz && i<kon && cur[i]==0)) { ok = false; break; } if (ok) wyn[kon-pocz]++; } } void ocen() { int f1=-1, l1=-1; REP(i, N) if (cur[i]==1) {f1 = i; break;} if (f1>=0) { FORD(i, N-1, 0) if (cur[i]==1) {l1 = i; break;} FOR(i, f1, l1) if (cur[i]==0) return; int len = l1-f1+1; int fX = 0, lX = 0; FORD(i, f1-1, 0) if (cur[i]==X) ++fX; else break; FOR(i, l1+1, N-1) if (cur[i]==X) ++lX; else break; if (fX<lX) swap(fX,lX); // lX jest <= fX for(int p = 0; p <= lX; p += 2) wyn[len+p]++; // += 1+p; if (lX%2==0) FOR(p, lX+1, fX) wyn[len+p]++; // += 1+lX for (int p = fX+lX; p >= fX+1; p-=2) wyn[len+p]++; // += 1+fX+lX-p; } else { int s = 0; while (s<N) { while (s<N && cur[s]==0) s++; if (s==N) break; int k = s+1; while (k<N && cur[k]==X) k++; for (int p = k-s; p>0; p -= 2) wyn[p]++; s = k; } } } void licz(int poz) { /* fprintf(stderr, "poz: %d\n", poz); REP(i, N) fprintf(stderr, "%d ", cur[i]); fprintf(stderr, "\n"); */ if (poz==Z) { ocen(); return; } if (cur[zam[poz][0]]==X && cur[zam[poz][1]]==X) { cur[zam[poz][0]] = cur[zam[poz][1]] = 0; licz(poz+1); cur[zam[poz][0]] = cur[zam[poz][1]] = 1; licz(poz+1); cur[zam[poz][0]] = X; cur[zam[poz][1]] = X; } else if (cur[zam[poz][0]]==0 || cur[zam[poz][1]]==1) { licz(poz+1); } else { swap(cur[zam[poz][0]], cur[zam[poz][1]]); licz(poz+1); swap(cur[zam[poz][0]], cur[zam[poz][1]]); } // fprintf(stderr, "return %d\n", poz); } int main() { scanf("%d%d", &N, &Z); REP(a, Z) { scanf("%d%d", &zam[a][0], &zam[a][1]); --zam[a][0]; --zam[a][1]; } REP(a, N) cur[a] = X; licz(0); REP(a, N) printf("%d%s", wyn[a+1]%2, a==N-1?" \n":" "); } |