比赛 2024暑假C班集训B 评测结果 AAAAAAAAAA
题目名称 Asm.Def的基本算法 最终得分 100
用户昵称 wdsjl 运行时间 0.102 s
代码语言 C++ 内存使用 4.50 MiB
提交时间 2024-07-11 10:35:26
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 100010;

const int mod = 1000000007;

//int tot;

long long tot,ans,dad[N],head[N],sum[N],w[N],n,da;

struct Edge{
    long long x,y,next;
//    Edge(int x=0,int y=0,int next=0)
//    x(x),y(y),next(next);
}edge[N<<1]; 

void add(int x,int y){
//    edge[++tot]=Edge(x,y,head[x]);
      edge[++tot].x=x;
      edge[tot].y=y;
      edge[tot].next=head[x];
    head[x]=tot;
}

void dfs(int x){
    sum[x]=w[x];
    for(long long int i=head[x];i;i=edge[i].next){
        if(!dad[edge[i].y]){
            dad[edge[i].y]=x;
            dfs(edge[i].y);
            ans=(ans%mod+sum[x]%mod*sum[edge[i].y]%mod*w[x]%mod)%mod;
            sum[x]=(sum[x]%mod+sum[edge[i].y])%mod;
//            cout<<ans<<" ";
        }
    }
}

int main(){
    freopen("asm_algo.in","r",stdin);
    freopen("asm_algo.out","w",stdout);
    scanf("%lld%lld",&n,&w[1]);                    
    for(int i=2;i<=n;i++){
        scanf("%lld%lld",&da,&w[i]);
        add(da,i);
    }
    dfs(1);
    ans=(ans%mod*2)%mod;
    for(int i=1;i<=n;i++)ans=(ans%mod+w[i]%mod*w[i]%mod*w[i]%mod)%mod;
    printf("%lld",ans);
    return 0;
}