题解:AT_arc185_d [ARC185D] Random Walk on Tree

题目传送门

题目大意:根上挂了 n 条长为 m 的链,从根开始,每次随机选择和当前点直接相连了点并走过去,求期望多少步后能走每个点至少一次。

fi 表示当前走到第i层,期望还需要多少步能走完一条链(到达链底)。

可以列出方程:fi={f1+1i=0fi1+fi+12+11i<m0i=m

不难推出 fmi=ii+1fmi1+i,所以 f1=m1mf0+m1,又有 f0=f1+1,所以 f0=m2

同理从链底走到根节点期望也是 m2 步。

走完 ni 条链后,由于走的方式是随机的,所以可以理解为在 n 条链中随机找一条来走,走对的概率是 in 的,所以期望要走 ni 次。

注意到最后一次走完不用回到根节点,所以答案为 (2i=1nni1)m2

Code:

#include<iostream> #include<cstdlib> #include<ctime> #include<cassert> #include<vector> #include<cmath> #include<cstring> #include<set> #include<climits> #include<queue> #include<map> #include<algorithm> using namespace std; const int N = 2e5 + 10, MOD = 998244353; long long ny[N]; int n, m; int main(){ // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; ny[0] = ny[1] = 1; for(int i = 2; i <= n; i++) ny[i] = (MOD - MOD / i) * ny[MOD % i] % MOD; long long sum = 0, t = 1ll * m * m % MOD; for(int i = n; i; i--){ sum = (sum + n * t % MOD * 2 % MOD * ny[i] % MOD) % MOD; } sum = (sum - t + MOD) % MOD; cout << sum << "\n"; }

__EOF__

本文作者louisliang
本文链接https://www.cnblogs.com/louisliang/p/18668256.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   louisliang  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示