当前位置: 首页 > news >正文

P3412 仓鼠找sugar II 题解

P3412\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU_P3412} }{{\color{Red}\Large Solution} }\mathbf{} {No.33} \end{Bmatrix}\times{}\) NeeDna

题意

给定一棵树,现在在树上随机游走,求从任意一点到任意一点的期望步数。

题解

这类树上游走的题有一个很经典的设计,我们先固定一个根 \(root\) 为终点,就是设 \(f_i\) 为自己到父亲的期望步数、设 \(d_i\) 为,此时\(f_{root}=0\),对于叶子\(f_i=1\)。对于其他点,我们可以推出来这个 \(f_i\)

\[f_i=\frac{1}{d_i}\times 1+\frac{1}{d_i}\times \sum_{son\in i}(f_{son}+f_i+1) \]

\[f_i=1+\frac{1}{d_i}\times \sum_{son\in i}(f_{son}+f_i) \]

\[\frac{1}{d_i}\times f_i=1+\frac{1}{d_i}\times \sum_{son\in i}f_{son} \]

\[f_i=d_i+\sum_{son\in i}f_{son} \]

我们发现这个 \(f_i\) 就是点 \(i\) 的子树的度数和,那么怎么用 \(f\) 来计算答案呢,我们发现固定 \(root\) 下每个点会经过的路径是确定的,所以对于每个点的期望就是从自己到 \(root\) 的所有点的期望和。反过来想,\(f_i\) 也就会被计算自己的子树大小(下文写作 \(sz_i\))的次数,也就是说贡献是 \(f_i\times sz_i\)。这样我们暴力对每个点做 \(root\) 下计算就是 \(\Theta(n^2)\) 的。

怎么优化呢,我们发现其实很多时候 \(f_i\)\(sz_i\) 都是一样的。所以我们分类讨论合并一下即可,先固定 \(root\) 设此时的 \(f\) 数组为 \(sumd\) 数组、\(sz\) 数组为 \(s\) 数组来防止混淆。对于所有可能的 \(root\) 每个点有如下几种情况:

  • 该节点就是终点:\(f_i=0\)\(sz_i=n\)\(1\) 次。

  • 终点在该节点的某一个儿子的子树 \(v\) 中:\(f_i=2\times n-2-sumd_v\)\(sz_i=n-s_v\)\(s_v\) 次。

  • 终点不在该节点的某一个儿子的子树中:\(f_i=sumd_i\)\(sz_i=s_i\)\(n-s_i\) 次。

\(2\times n-2\) 是什么:是树上的度数和。

最后对于每一个节点直接统计即可,因为终点起点的匹配有 \(n^2\) 种,所以所有期望加起来要乘 \(n^2\) 的逆元。

code:

#include<bits/stdc++.h>
#define pb push_back
#define int long long
using namespace std;
const int N=1e5+10,mod=998244353;
int n,d[N],f[N],ans,sz[N],ft[N];
vector<int> g[N];
void dfs(int u,int fa){sz[u]=1;f[u]=d[u];ft[u]=fa;for(int v:g[u]){if(v==fa) continue;dfs(v,u);int x=2*n-2-f[v];ans=(ans+((n-sz[v])*sz[v]%mod)*x)%mod;sz[u]+=sz[v];f[u]+=f[v];}ans=(ans+((sz[u]*(n-sz[u]))%mod)*f[u])%mod;
}
int ksm(int x,int k){int ans=1;while(k){if(k%2) ans=ans*x%mod;x=x*x%mod;k/=2;}return ans;
}
signed main(){cin>>n;for(int i=1,u,v;i<n;i++){cin>>u>>v;d[u]++,d[v]++;g[u].pb(v);g[v].pb(u);}dfs(1,0);cout<<ans*ksm(n*n%mod,mod-2)%mod;return 0;
}
http://www.sczhlp.com/news/362.html

相关文章:

  • 中国科学院院士夏培肃|学术成长历程的关键事件、重要节点、师承关系
  • 【深度解析】文件安全传输网关解决方案,安全合规哪家强?
  • 非常棒的unity插件——体素世界
  • 开源新旗舰 GLM-4.5:不想刷榜,只想干活儿
  • Nodejs安装笔记
  • 「中望CAD机械版2025最新版下载+浮动许可激活教程」
  • 2025最新文件摆渡系统评测:这5大功能让跨网传输更高效
  • Fastmcp 案例三(DeepChat调式 ,结合案例二)
  • webdriver中的三种等待
  • Python 操作 PDF 文档:主流库选型指南 - E
  • claudecode使用mcp
  • 服务器数据同步:安全高效方案看这里!
  • 微软云(Windows Azure)计算平台的结构及分析
  • 大师 - 杯酒
  • 常用网址
  • 教师资格证考试面试报名流程
  • 平衡树(未完待续)
  • 告别FTP!跨网文件安全交换系统让数据流转0风险
  • CVE-2018-8715 AppWeb认证绕过漏洞 (复现)
  • 树04
  • 周进度报告1
  • 白话Docker系列(二):用Web应用实例深入容器
  • svn强制添加已忽略文件
  • 跨网文件交换新方案:合规审批+传输加密双保障!
  • FastMcp 案例四(Streamable-http)
  • 数仓ETL建设思路
  • SSH-Agent 启用失败问题
  • Django模型开发:模型字段、元数据与继承全方位讲解
  • 矿山领航者:向明智控如何通过CRM实现数字化升级
  • BeanFactory和FactoryBean的区别