#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":" "); } |
English