#include #include using namespace std; int n; vector w; vector > connected; vector visited; int countBack(int node) { if (visited[node]) { return 0; } visited[node] = true; if (connected[node][node]) { return -1; } int result = (w[node] == 0) ? 1 : 0; for (int i = 0; i < n; ++i) { if (connected[node][i]) { int count = countBack(i); if (count == -1) { return -1; } result += count; } } return result; } int main() { cin >> n; vector d(n); for (int i = 0; i < n; ++i) { cin >> d[i]; } w.resize(n); for (int i = 0; i < n; ++i) { cin >> w[i]; } connected.assign(n, vector(n)); visited.assign(n, false); for (int i = 0; i < n; ++i) { int dist = d[i] % n; int node1 = (i + dist) % n; int node2 = (i + n - dist) % n; connected[node1][node2] = true; connected[node2][node1] = true; } bool possible = true; for (int i = 0; i < n; ++i) { if (!visited[i]) { int backs = countBack(i); if (backs != -1 && backs % 2 == 1) { possible = false; break; } } } cout << (possible ? "Yes" : "No") << endl; return 0; }