Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\)
Link.
有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \(p_{i,k}\)。依照此规则确定权值后,你不停抽卡,每次抽到第 \(i\) 张卡牌的概率正比于 \(w_i\),直到所有卡都被抽过至少一次。
此后,记 \(t_i\) 表示第 \(i\) 张牌第一次被抽到的时间。给定 \(n-1\) 条形如 \(\lang u,v\rang\) 的限制,表示 \(t_u<t_v\),保证 \(\lang u,v\rang\) 构成的有向图的基图是一棵树。得到的 \(\{t_n\}\) 满足限制的概率,答案模 \(998244353\)。
\(n\le10^3\)。
\(\mathcal{Solution}\)
其实是 trick + 板子,但是没见过的话使得想一会儿。
考虑若树是严格外向树怎么做,这时点 \(u\) 要满足的条件有且仅有「对于所有 \(u\) 子树内的结点 \(v\),\(t_u<t_v\)」。设 \(u\) 子树内的点权和已经确定为 \(s_u\),\(w_u\) 也已确定,则概率显然为 \(\frac{w_u}{s_u}\)。继而得到 DP:令 \(f(u,i)\) 表示 \(u\) 子树内点权和为 \(i\) 时,子树内合法的概率,转移时需要注意 \(\frac{w_u}{s_u}\) 需要转化成条件概率(或者除掉再把新的乘上去)。
接下来走进一般情况,仍然如外向树般,钦定一个根 \(r\),把指向 \(r\) 的边理解为外向树边“反向”,对于这些边,如果按照正常的外向树做 DP,就相当于「钦定这条限制不合法」;如果忽略这条边,就相当于「这条限制不一定合法」,最后能得到「至少有一些限制不合法」,那么带着容斥系数做 DP 就行。复杂度 \(\mathcal O(wn^2)\)。
\(\mathcal{Code}\)
/*+Rainybunny+*/
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i)
const int MAXN = 1e3, MOD = 998244353;
int ecnt = 1, n, m, head[MAXN + 5], pr[MAXN + 5][3], inv[MAXN * 3 + 5];
int siz[MAXN + 5], f[MAXN + 5][MAXN * 3 + 5];
struct Edge { int to, nxt; } graph[MAXN * 2 + 5];
inline void link(const int u, const int v) {
graph[++ecnt].to = v, graph[ecnt].nxt = head[u], head[u] = ecnt;
graph[++ecnt].to = u, graph[ecnt].nxt = head[v], head[v] = ecnt;
}
inline void subeq(int& u, const int v) { (u -= v) < 0 && (u += MOD); }
inline int mul(const int u, const int v) { return 1ll * u * v % MOD; }
inline int sub(int u, const int v) { return (u -= v) < 0 ? u + MOD : u; }
inline void addeq(int& u, const int v) { (u += v) >= MOD && (u -= MOD); }
inline int add(int u, const int v) { return (u += v) < MOD ? u : u - MOD; }
inline int mpow(int u, int v) {
int ret = 1;
for (; v; u = mul(u, u), v >>= 1) ret = mul(ret, v & 1 ? u : 1);
return ret;
}
inline void solve(const int u, const int fa) {
siz[u] = 1;
rep (i, 1, 3) f[u][i] = mul(i, pr[u][i - 1]);
for (int i = head[u], v; i; i = graph[i].nxt) {
if ((v = graph[i].to) != fa) {
solve(v, u);
static int tmp[MAXN * 3 + 5];
rep (j, 1, siz[u] * 3) rep (k, 1, siz[v] * 3) {
int t = mul(f[u][j], f[v][k]);
if (i & 1) subeq(tmp[j + k], t), addeq(tmp[j], t);
else addeq(tmp[j + k], t);
}
siz[u] += siz[v];
rep (j, 1, siz[u] * 3) f[u][j] = tmp[j], tmp[j] = 0;
}
}
rep (i, 1, siz[u] * 3) f[u][i] = mul(f[u][i], inv[i]);
}
int main() {
scanf("%d", &n);
rep (i, 1, n) {
int s = 0;
rep (j, 0, 2) scanf("%d", &pr[i][j]), s += pr[i][j];
s = mpow(s, MOD - 2);
rep (j, 0, 2) pr[i][j] = mul(s, pr[i][j]);
}
rep (i, 2, n) {
int u, v; scanf("%d %d", &u, &v);
link(u, v);
}
inv[1] = 1;
rep (i, 2, 3 * n) inv[i] = mul(inv[MOD % i], MOD - MOD / i);
solve(1, 0);
int ans = 0;
rep (i, 1, siz[1] * 3) addeq(ans, f[1][i]);
printf("%d\n", ans);
return 0;
}
Solution -「CTS 2019」「洛谷 P5404」氪金手游的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- 「CTS2019」氪金手游
「CTS2019」氪金手游 解题思路 考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了. 令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子 ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】
题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...
随机推荐
- [网络编程] 自己构建一个cgi.FieldStorage()的对象
问题描述: 通常cgi.FieldStorage()返回一个类似于Python字典的对象. 在cgi框架中必须通过浏览器发送表单过来才能接受消息 那么我该怎么进行本地调试呢? 或者说在没有搭建好一整套 ...
- Nginx日志通过Flume导入到HDFS中
关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) flume上传到hdfs: 当我们的数据量比较大时,比如每天的日志文件达到5G以上 使用ha ...
- PPT2010制作翻牌动画
原文: https://www.toutiao.com/i6492653280676545037/ 新建一张空白幻灯片 选择"插入"选项卡,"插入"功能组,&q ...
- What's The Next|Kube-OVN 社区线上 Meetup 预告!
Kube-OVN 社区线上Meetup 直播预约通道已开启! 活动时间 2021年8月26日(周四)19:00-20:30 活动介绍 8月26日,Kube-OVN 社区 Meetup 将通过线 ...
- android-sdk环境变量配置
1.android-sdk环境变量 1.在系统变量新建:ANDROID_HOME,对应变量值为:G:\android-sdk-windows(sdk安装路径) 2.path添加两个变量(tools和p ...
- kafka学习笔记(二)kafka的基本使用
概述 第一篇随笔从消息队列的定义和各种应用,以及kafka的分类定义和基本知识,第二篇就写一篇关于kafka的基本实际配置和使用的随笔,包括kafka的集群参数的配置,生产者使用机制,消费者使用机制. ...
- CesiumJS下载量超过1百万次
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ CesiumJS的下载总量已经超过100万.这一里程碑对我们(C ...
- DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ | TORCH.AUTOGRAD
torch.autograd 是PyTorch的自动微分引擎,用以推动神经网络训练.在本节,你将会对autograd如何帮助神经网络训练的概念有所理解. 背景 神经网络(NNs)是在输入数据上执行的嵌 ...
- Docker安装配置mysql
Docker安装mysql踩坑日记 拉取镜像 sudo docker pull mysql:5.7 运行镜像 docker run -p 3306:3306 --name mysql -v /myda ...
- Floodlight+Mininet的SDN实验平台搭建初探
平台环境说明: Cpu:Intel Core 2 Duo T6570 Mem:4.00GB Os :Ubuntu 14.04 1.Floodlight Floodlight是一个比较成熟的sdn控制器 ...