求助85ptsWA
查看原帖
求助85ptsWA
945646
analysis楼主2023/10/15 21:50
#include <bits/stdc++.h>
#define int long long
const int mod = 998244353;
using namespace std;
int f[500005][61][2], sf[500005];
int n;
vector<int> to[500005];
int v[500005];
#define bit(x,i) v[x] >> (i-1) & 1
int dp(int x)
{
    for (int i = 1; i <= 60; i++)f[x][i][bit(x,i)] = 1;
    for(auto ed : to[x])
    {
        dp(ed);
        for (int i = 1; i <= 60; i++)
        {
            int zero = f[x][i][0],one = f[x][i][1];
            f[x][i][0] = f[x][i][1] = 0;
            f[x][i][0] = (f[ed][i][0] * zero % mod + f[ed][i][1] * one % mod + sf[ed] * zero % mod) % mod;
            f[x][i][1] = (f[ed][i][0] * one % mod + f[ed][i][1] * zero % mod + sf[ed] * one % mod) % mod;
        }
    }
    for(int i = 1; i <= 60; i++)
    {
        sf[x] = (sf[x] + f[x][i][1] * (1LL<<(i-1)) % mod) % mod;
    }
    return sf[x];
}
signed main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &v[i]);
    }
    for (int i = 2, ed; i <= n; i++)
    {
        scanf("%lld", &ed);
        to[ed].push_back(i);
    }
    printf("%lld", dp(1));
    return 0;
}
2023/10/15 21:50
加载中...