/* -*- coding: utf-8 -*- * * 74.cc: No.74 貯金箱の退屈 - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 100; typedef long long ll; const int INF = 1 << 30; const ll LINF = 1LL << 60; /* typedef */ typedef vector vi; typedef queue qi; typedef pair pii; typedef bitset bn; typedef vector vbn; /* global variables */ int n, ds[MAX_N]; bn wis, bms[MAX_N], gl; vbn vbs[MAX_N]; /* subroutines */ void print_v(bn &v) { for (int i = 0; i < n; i++) printf("%d", v.test(i)); putchar('\n'); } void print_m(bn (&m)[MAX_N]) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) printf("%d", m[i].test(j)); putchar('\n'); } } void check(int u, bn ubs) { //printf("%d: ", u); print_v(ubs); if (ubs == gl) { puts("Yes"); exit(0); } if (u >= n) return; if (ubs.test(u)) { vbn &uvb = vbs[u]; for (vbn::iterator vit = uvb.begin(); vit != uvb.end(); vit++) check(u + 1, ubs ^ *vit); } check(u + 1, ubs); } /* main */ int main() { cin >> n; for (int i = 0; i < n; i++) cin >> ds[i]; for (int i = 0; i < n; i++) { bool wi; cin >> wi; wis.set(i, ! wi); } for (int i = 0; i < n; i++) { int i0 = (i + ds[i]) % n; int i1 = i - ds[i]; while (i1 < 0) i1 += n; bms[i].set(i0); bms[i].set(i1); vbs[min(i0, i1)].push_back(bms[i]); } //print_v(wis); print_m(bms); //for (int i = 0; i < n; i++) printf("%lu ", vbs[i].size()); putchar('\n'); check(0, wis); puts("No"); return 0; }