#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define endl '\n' #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define uniq(v) (v).erase(unique((v).begin(), (v).end()), (v).end()) typedef long long ll; typedef long double ld; typedef pair P; typedef complex comp; typedef vector< vector > matrix; struct pairhash { public: template size_t operator()(const pair &x) const { size_t seed = hash()(x.first); return hash()(x.second) + 0x9e3779b9 + (seed<<6) + (seed>>2); } }; const int inf = 1e9 + 9; const ll mod = 1e9 + 7; const double eps = 1e-8; const double pi = acos(-1); int N; int d[110]; bool w[110]; // rank on GF(2) const int max_n = 110; int matrix_rank(vector > A, int n) { int m = A.size(); int i, idx = 0; for (i = 0; i < m && idx < n; i++, idx++) { if (!A[i][idx]) { bool f = false; int j, k; for (j = idx; j < n; j++) { for (k = i; k < m; k++) { if (A[k][j]) { f = true; break; } } if (f) break; } if (!f) return i; swap(A[i], A[k]); idx = j; } for (int j = i+1; j < m; j++) { if (A[j][idx]) A[j] ^= A[i]; } } return min(i, idx); } bool solve() { vector > A(N), Ab(N); for (int i = 0; i < N; i++) { int a = (i + d[i]) % N; int b = (i - d[i] + N*1010) % N; if (a == b) { A[a][i] = Ab[a][i] = true; } else { A[a][i] = Ab[a][i] = true; A[b][i] = Ab[b][i] = true; } Ab[i][N] = !w[i]; } return matrix_rank(A, N) == matrix_rank(Ab, N+1); } void input() { cin >> N; for (int i = 0; i < N; i++) cin >> d[i]; for (int i = 0; i < N; i++) cin >> w[i]; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout << fixed << setprecision(15); input(); cout << (solve()?"Yes":"No") << endl; }