提交时间:2025-10-03 13:58:54

运行 ID: 38326

#include <bits/stdc++.h> #define int long long using namespace std; const int mod = 1e9 + 7; int n,a[100005],fa[100005]; vector <int> e[100005]; int dp[100005][3],sz[100005]; inline int pw (int x,int y) { int r = 1; while (y) { if (y & 1) { r *= x; r %= mod; } x *= x; x %= mod; y >>= 1; } return r; } int ny; inline void dfs (int u) { int x = 0,sum = 0; sz[u] = 1; for (auto v : e[u]) { if (v == fa[u]) { continue; } dfs(v); x |= a[v]; sum += a[v]; sz[u] += sz[v]; dp[u][0] += (dp[v][0] + dp[v][1]) * ny % mod; dp[u][0] %= mod; } dp[u][1] = dp[u][0]; dp[u][0] = (dp[u][0] + (a[u] + (a[u] ^ x)) % mod * ny % mod) % mod; dp[u][0] = (dp[u][0] - a[u] * pw(ny,e[u].size()) % mod) % mod; dp[u][0] = (dp[u][0] + mod) % mod; dp[u][1] = (dp[u][1] + x * ny) % mod; dp[u][1] = (dp[u][1] - sum * pw(ny,e[u].size()) % mod) % mod; dp[u][1] = (dp[u][1] + mod) % mod; return; } signed main () { ny = pw(2,mod - 2); cin >> n; for (int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 2;i <= n;i++) { cin >> fa[i]; e[fa[i]].push_back(i); } dfs(1); cout << dp[1][0] * pw(2,sz[1] - 1) % mod << endl; return 0; }