
2017ccpc杭州 D - Master of Random(hdu6267 期望 + 找规律)
发布日期:2021-05-04 18:29:24
浏览次数:21
分类:技术文章
本文共 1142 字,大约阅读时间需要 3 分钟。
题意:
有n个点,每个点对应一个权值,现在要建一颗树,给第 i 个点从点[0, i - 1]中随机选择一个父亲节点,求树中所有子树权值之和的期望
思路:
没啥思路 硬找规律
n = 4的情况:
发现0号点贡献了6次,6 = 3!
1号点贡献了12次,12 = 3!+ 3!/ 1
2号点贡献了15次,15 = 3!+ 3!/ 1 + 3!/ 2
3号点贡献了17次,17 = 3!+ 3!/ 1 + 3!/ 2 + 3!/ 3
于是 x 号点贡献的次数为 n! + n! / 1 + n! / 2 + ..... + n! / x
别忘了最后求的是期望,除以 n!
#includeusing namespace std;typedef long long ll;const ll mod = 998244353;const double eps = 1e-11;const int N = 1e5 + 10;ll fac[N], fun[N];ll qpow(ll a, ll b) { ll ans = 1; a %= mod; while(b) { if(b & 1) ans = ans * a % mod; a = a * a % mod; b >>= 1; } return ans % mod;}void init() { fac[0] = 1; for(int i = 1; i < N; ++i) fac[i] = fac[i - 1] * i % mod; fun[0] = 1; for(int i = 1; i < N; ++i) fun[i] = (fun[i - 1] + qpow(i, mod - 2)) % mod;}int main() { init(); int t, n; ll a; scanf("%d", &t); while(t--) { scanf("%d", &n); ll ans = 0; for(int i = 0; i < n; ++i) { scanf("%lld", &a); ans = (ans + fun[i] * a % mod) % mod; } printf("%lld\n", ans * qpow(fac[n], mod - 2) % mod * fac[n - 1] % mod); } return 0;}
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月26日 04时43分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Docker - 部署 Redis 6.0.8
2019-03-03
Android - Broadcasts overview(不完整)
2019-03-03
STL基础梳理 2019.1.19(仿函数,谓词,内建函数对象,适配器,算法)
2019-03-03
并发情况下三种线程/并发安全
2019-03-03
C#,asp.net,ashx处理session
2019-03-03
501 5.1.7 Invalid address
2019-03-03
foxmail 登录 exchange 2013 exchange 2016
2019-03-03
Netty高性能原理和框架架构解析
2019-03-03
C# WinForm 监视文件变化程序
2019-03-03
Java基础之反射
2019-03-03
对象的创建、内存布局和访问定位
2019-03-03
FreeRTOS学习笔记(9)——内存管理
2019-03-03
ESP8266学习笔记(10)——官方WebServer
2019-03-03
CC2640R2F学习笔记(6)——UART串口使用
2019-03-03
SHELL命令
2019-03-03
自然划分的3-4-5规则
2019-03-03
Latex中cases环境引入报错
2019-03-03
Latex排版的时候把图片放在指定位置
2019-03-03