P7247 题解
参考 EI 题解。
思路
因为随机移动,所以可以不管当前在具体哪个点,发现本质不同的只有根节点和非根节点。设
可以 dfs 预处理三个值。期望转为总和除以方案数。记
对于
移项解得:
递推即可,发现
code
int n,a[maxn];
int head[maxn],tot;
struct nd{
int nxt,to,w;
}e[maxn<<1];
void add(int u,int v,int w){e[++tot]={head[u],v,w};head[u]=tot;}
int x,y,z;
int dis[maxn],sum[maxn],siz[maxn],sa[maxn],mul[maxn];
int inc(int u,int v){
((u+=v)>=mod)&&(u-=mod);
return u;
}
void dfs(int u,int fa){
if(u!=1)(x+=dis[u]*a[u])%=mod,(y+=dis[u]*a[1])%=mod;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa)continue;
dis[v]=inc(dis[u],e[i].w);dfs(v,u);
siz[u]+=siz[v],sum[u]=inc(sum[u],sum[v]),sa[u]=inc(sa[u],sa[v]),mul[u]=inc(mul[u],mul[v]);
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa)continue;
(z+=(siz[u]-siz[v])*(mul[v]-dis[u]*sa[v]%mod+mod))%=mod;
(z+=(sa[u]-sa[v]+mod)*(sum[v]-siz[v]*dis[u]%mod+mod))%=mod;
}
if(u!=1){
(z+=a[u]*(sum[u]-siz[u]*dis[u]%mod+mod))%=mod;
(z+=mul[u]-dis[u]*sa[u]%mod+mod)%=mod;
}
siz[u]++,sum[u]=inc(sum[u],dis[u]),sa[u]=inc(sa[u],a[u]),(mul[u]+=a[u]*dis[u])%=mod;
}
int dp[maxn][2];
int inv[maxn];
void work(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<n;i++){
int u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);
}
dfs(1,0);
inv[0]=inv[1]=1;for(int i=2;i<=n;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
x=x*inv[n-1]%mod,y=y*inv[n-1]%mod,z=z*inv[n-1]%mod*inv[n-2]%mod;
for(int i=1;i<n;i++){
dp[i][0]=(dp[i-1][1]+((n-1)*(i+1)%mod*x+(n-i-1)*y+(n-i-1)*(n-2)%mod*z)%mod*inv[i]%mod*inv[n])%mod;
dp[i][1]=(dp[i-1][1]+((n-1)*x+(n-1)*y+(n-1)*(n-2)%mod*z)%mod*inv[i]%mod*inv[n])%mod;
}
printf("%lld\n",dp[n-1][0]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话