提交时间:2025-10-03 16:26:42
运行 ID: 38381
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1e5+10,M=1e9+7; int n,a[N],ans,p[N]; vector<int>e[N]; void dfs(int u){ int cnt=1,sum=a[u];vector<int>num;num.clear(); for(int i=0;i<=29;i++)num.push_back(0); for(auto v:e[u]){ dfs(v);cnt++;sum=(sum+a[v])%M; for(int i=0;i<=29;i++){ num[i]+=(a[v]>>i)&1; } } int res=0; if(u==1){ for(int i=0;i<=29;i++){ if(num[i]==0&&((a[u]>>i)&1)==0)continue; if(num[i]==0)res=(res+p[i]*p[cnt-1]%M*p[n-cnt]%M)%M; else res=(res+p[i]*p[cnt-2]%M*p[n-cnt]%M)%M; } // cout<<res<<" "<<sum<<" "<<p[n-cnt]<<endl; res=(res-a[u]*p[n-cnt]%M+M)%M; // cout<<u<<" "<<res<<endl; ans=(ans+res)%M; return; } for(int i=0;i<=29;i++){ num[i]+=(a[u]>>i)&1; if(num[i]==0)continue; res=(res+p[i]*p[cnt-1]%M*p[n-1-cnt]%M)%M; } res=(res-sum*p[n-1-cnt]%M+M)%M; ans=(ans+res)%M; // cout<<u<<" "<<res<<endl; } signed main(){ p[0]=1;for(int i=1;i<=N-10;i++)p[i]=p[i-1]*2%M; scanf("%lld",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); int fa; for(int i=2;i<=n;i++){ scanf("%lld",&fa); e[fa].push_back(i); } dfs(1); printf("%lld\n",ans); return 0; }