「CTS2019」氪金手游
「CTS2019」氪金手游
解题思路
考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了。
令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子树,子树内 \(\sum w=i\) 的合法概率,可以简单证明子树外的选取是不影响子树内的答案的,所以可以这样表示。
证明:我们只考虑子树内的第一个选出根节点 \(u\) 的概率是 \(\frac{w_u}{i}\),假设当前未被选走的卡的概率之和为 \(S\) ,那么考虑全部未被选走的卡,子树内第一个选走 \(u\) 的概率为
=\dfrac{w_u}{S}\times\dfrac{1}{1-\frac{S-i}{S}} \\
=\dfrac{w_u}{S} \times \frac{i}{S}= \frac{w_u}{i}
\]
两式相等,得证。
转移比较显然,因为是外向树,所以 \(u\) 要当中第一个被选中,剩下相当于对 \(w\) 做背包,直接从儿子合并即可。
考虑不是一棵外向树对其进行容斥,令 \(G(k)\) 表示有 \(k\) 条反向边被钦点为正向,剩下的反向边可反向也可正向的方案数,那么答案就是 \(\sum_{i=0}^m (-1)^i G(i)\) 。
发现可反向也可正向相当于把这条边删掉,两个连通块贡献用乘法原理合并,然后把容斥系数带到 \(dp\) 转移里面计算即可。
code
/*program by mangoyang*/
#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int mod = 998244353;
vector<int> g[1005], d[1005];
int dp[1005][3005], sz[1005], w[1005][4], a[3005], n;
inline void up(int &x, int y){
x = x + y >= mod ? x + y - mod : x + y;
}
inline int Pow(int a, int b){
int ans = 1;
for(; b; b >>= 1, a = 1ll * a * a % mod)
if(b & 1) ans = 1ll * ans * a % mod;
return ans;
}
inline void gao(int u, int v, int type){
for(int i = 1; i <= 3 * sz[u]; i++)
for(int j = 1; j <= 3 * sz[v]; j++){
int x = 1ll * dp[u][i] * dp[v][j] % mod;
if(type) up(a[i], x);
up(a[i+j], type ? mod - x : x);
}
for(int i = 1; i <= 3 * (sz[u] + sz[v]); i++)
dp[u][i] = a[i], a[i] = 0;
sz[u] += sz[v];
}
inline void dfs(int u, int fa){
sz[u] = 1;
dp[u][1] = w[u][1], dp[u][2] = w[u][2], dp[u][3] = w[u][3];
for(auto v : g[u])
if(v != fa) dfs(v, u), gao(u, v, 0);
for(auto v : d[u])
if(v != fa) dfs(v, u), gao(u, v, 1);
for(int i = 1; i <= 3 * sz[u]; i++)
dp[u][i] = 1ll * dp[u][i] * Pow(i, mod - 2) % mod;
}
int main(){
read(n);
for(int i = 1, x, y, z; i <= n; i++){
read(x), read(y), read(z);
int s = Pow(x + y + z, mod - 2);
w[i][1] = 1ll * x * s % mod;
w[i][2] = 2ll * y * s % mod;
w[i][3] = 3ll * z * s % mod;
}
for(int i = 1, x, y; i < n; i++){
read(x), read(y);
g[x].push_back(y);
d[y].push_back(x);
}
dfs(1, 0);
int ans = 0;
for(int i = 1; i <= 3 * n; i++) up(ans, dp[1][i]);
cout << ans << endl;
return 0;
}
「CTS2019」氪金手游的更多相关文章
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- 【CTS2019】氪金手游(动态规划)
[CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...
- LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP
题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】
Description Solution 首先它的限制关系是一个树形图 首先考虑如果它是一个外向树该怎么做. 这是很简单的,我们相当于每个子树的根都是子树中最早出现的点,概率是容易计算的. 设DP状态 ...
- [LOJ3124][CTS2019|CTSC2019]氪金手游:树形DP+概率DP+容斥原理
分析 首先容易得出这样一个事实,在若干物品中最先被选出的是编号为\(i\)的物品的概率为\(\frac{W_i}{\sum_{j=1}^{cnt}W_j}\). 假设树是一棵外向树,即父亲比儿子先选( ...
- [CTS2019]氪金手游
[CTS2019]氪金手游 各种情况加在一起 先考虑弱化版:外向树,wi确定 i合法的概率就是wi/sw sw表示子树的w的和,和子树外情况无关 这些概率乘起来就是最终合法的概率 如果都是外向树, f ...
- 「UOJ207」共价大爷游长沙
「UOJ207」共价大爷游长沙 解题思路 : 快速判断两个集合是否完全相等可以随机点权 \(\text{xor}\) 的思路可以用到这道题上面,给每一条路径随机一个点权,维护出经过每一条边的点权的 \ ...
随机推荐
- 均值不等式中的一则题目$\scriptsize\text{$(a+\cfrac{1}{a})^2+(b+\cfrac{1}{b})^2\ge \cfrac{25}{2}$}$
例题已知正数\(a.b\)满足条件\(a+b=1\),求\((a+\cfrac{1}{a})^2+(b+\cfrac{1}{b})^2\)的最小值: 易错方法\((a+\cfrac{1}{a})^2+ ...
- 编译失败,无法安装APK
编译失败,无法安装APK. 把libs目录中,全部内容清空,再重新编译就可以了. 应该是有些组件有冲突的原因! -------------------------------------------- ...
- github上如何删除一个项目(仓库)
备忘 链接:https://blog.csdn.net/deng0zhaotai/article/details/38535251
- MariaDB主从复制虚拟机实战
MariaDB简介: MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQ ...
- python ocr图片中汉字识别
import os os.chdir("C:\Program Files (x86)\Tesseract-OCR") main = "Tesseract.exe d:/t ...
- activiti 术语 国际化文件
activiti-explorer editor-app 国际化文件 - 大强的博客 - CSDN博客https://blog.csdn.net/daqiang012/article/details/ ...
- Mysql中的Date转换
一.背景 Mysql中有张表,表的一列为Date类型. 1. 插入日期xxx.setCreateTime(new Date())mybatis.insert(xxx) 2. 读取日期用Mybaitis ...
- [译]如何在红帽系统(RHEL)上源码安装python3?
原文来源: https://stackoverflow.com/questions/8087184/installing-python-3-on-rhel 很容易手动安装. 1.下载对应的python ...
- 深入分析GCC
深入分析GCC 目录 前言章 GCC概述 11.1 GCC的产生与发展 11.2 GCC的特点 21.3 GCC代码分析 3第2章 GCC源代码分析工具 42.1 vim ctags代码阅读工具 42 ...
- mysql8忘记秘密-重置密码步骤
mysql8修改密码的方式有些许不同 1.配置无密码登录 修改/etc/my.cnf文件,在mysqld模块下添加 skip-grant-tables 2.重启mysql 3.mysql -uroot ...