比赛 |
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;
}