| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38383 | hi_hi | 【S】T1 | C++ | 解答错误 | 10 | 897 MS | 7288 KB | 2520 | 2025-10-03 16:32:51 |
#include<bits/stdc++.h> using namespace std; long long n,a[100005],md=1000000007,top[100005],sum,ji[100005],ans,jj[35]; vector<long long>poi[100005]; inline long long qw(long long d,long long z){ if(z<0)return 1; d=d%md; if(z==0)return 1; long long _=qw(d,z/2); _=_%md; _=_*_; _%=md; if(z%2==1)_=((_*d)%md); _=_%md; return (_%md); } int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } for(int i=2;i<=n;i++){ long long _; scanf("%lld",&_); ji[_]++; poi[_].push_back(i); } for(int i=1;i<=n;i++){ memset(jj,0,sizeof(jj)); for(int j=0;j<=34;j++){ if(((a[i]>>j)&1)==1)jj[j]++; } for(int j=0;j<poi[i].size();j++){ for(int k=0;k<=34;k++){ if(((a[poi[i][j]]>>k)&1)==1)jj[k]++; } } for(int j=0;j<5;j++){ //printf("%lld ",jj[j]); } //printf("\n"); if(i!=1){ //printf("\n\n%lld:",i); for(int j=0;j<=34;j++){ if(jj[j]==0)continue; long long _=qw(2,1+poi[i].size()-jj[j])*qw(2,jj[j]-1); _--; if(jj[j]!=1)_-=1; _%=md; _=_*qw(2,n-2-poi[i].size()); _%=md; _=_*qw(2,j); _%=md; ans+=max(_,0ll); ans%=md; //printf("//%lld// ",_); } //printf("\n\n"); } else{ for(int j=0;j<=34;j++){ if(jj[j]==0)continue; if(((a[i]>>j)&1)==1){ long long _=qw(2,1+poi[i].size()-jj[j])*qw(2,jj[j]-2); _--; _%=md; _=_*qw(2,n-1-poi[i].size()); _%=md; _=_*qw(2,j); _%=md; ans+=_; ans%=md; } else{ long long _=qw(2,poi[i].size()-jj[j])*qw(2,jj[j]-1); _%=md; _=_*qw(2,n-1-poi[i].size()); _%=md; _=_*qw(2,j); _%=md; ans+=_; ans%=md; } } } } printf("%lld\n",ans); }