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传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...
随机推荐
- Mysql字符串字段判断是否包含某个字符串的方法
方法一:like SELECT * FROM 表名 WHERE 字段名 like "%字符%"; 方法二:find_in_set() 利用mysql 字符串函数 find_in_s ...
- spring boot + mybatis + mybatis逆向工程 --- 心得
1.前言 以前用惯了springMVC框架 ,以SSM 框架 来开发项目 ,现在因为需要,使用spring boot框架,那么mybatis该如何与spring boot结合呢? 结构区别不大,但是 ...
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...
- python 迭代器链式处理数据
pytorch.utils.data可兼容迭代数据训练处理,在dataloader中使用提高训练效率:借助迭代器避免内存溢出不足的现象.借助链式处理使得数据读取利用更高效(可类比操作系统的资源调控) ...
- 乒乓球队比赛,甲队有abc三人,乙队有xyz三人。 抽签得出比赛名单:a不和x比,c不和x,z比, 利用集合求出比赛名单
import java.util.HashMap; import java.util.Map; /** * 乒乓球队比赛,甲队有abc三人,乙队有xyz三人. * 抽签得出比赛名单:a不和x比,c不和 ...
- 关于APP设计规范和一些图层命名
首先,本人大学计算机专业出身,学过编程,工作的时候做过 产品经理,设计师,前端工程师,对工作的流程都有一些见解. 现在主攻前端工程师,做Web APP.今天收到设计师的设计稿,一看图层分类,这让我感觉 ...
- Android EditText不弹出输入法总结,焦点问题的总结
看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的时候默认弹出输入法,可以这样设置这个属相:android:windowSoftInputMod ...
- HttpRunner3的用例是怎么运行起来的
在PyCharm中打开examples/httpbin/basic_test.py: 首先映入眼帘的是左上角那个绿色小箭头,点了一下,可以直接运行,意味着HttpRunner是能够直接被pytest驱 ...
- 【pwn】学pwn日记——栈学习(持续更新)
[pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...
- nacos集群开箱搭建
记录/朱季谦 nacos是一款易于构建云原生应用的动态服务发现.配置管理和服务管理平台,简单而言,它可以实现类似zookeeper做注册中心的功能,也就是可以在springcloud领域替代Eurek ...