「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}\) 的思路可以用到这道题上面,给每一条路径随机一个点权,维护出经过每一条边的点权的 \ ...
随机推荐
- flume 测试 hive sink
测试flume,将数据送到hive表中,首先建表. create table order_flume( order_id string, user_id string, eval_set string ...
- Noip2019暑期训练2 反思
经过两次测试,通过深刻的反思,我主要发现了以下易犯错误: 1.做题目时过于追求速度,导致好几处代码都出现手误打错的现象!而且,千万不要图快.图方便就复制粘贴,非常容易出错!(例如T3-party中直接 ...
- 超级简单的tab点击
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- tf.matmul()报错expected scalar type Float but found Double
tf.matmul(a,b)将矩阵a乘以矩阵b,生成a * b,这里的a,b要有相同的数据类型,否则会因为数据类型不匹配而出错. 如果出错,请看是前后分别是什么类型的,然后把数据类型进行转换.
- 在mybatis中写sql语句的一些体会
本文会使用一个案例,就mybatis的一些基础语法进行讲解.案例中使用到的数据库表和对象如下: article表:这个表存放的是文章的基础信息 -- ------------------------- ...
- Spring cloud微服务安全实战-7-2docker快速入门
因为后面运行的这些可视化的工具都是用docker去run 的.为了避免对docker完全没有概念的同学听不懂,帮助大家从概念上去理解docker是个什么东西. 最核心的东西就是镜像,把它理解为Spri ...
- Laya页面嵌套和Scene.destory导致的Bug
Laya2.1.1.1 参考: 预设使用 Laya给出了相同模块,逻辑代码也相同情况下,使用页面嵌+runtime的使用方案.但是该方案和Laya.Scene.open,Laya.Scene.dest ...
- 一篇文章学会shell脚本
一.Shell传递参数 #!/bin/bash # 假设在脚本运行时写了三个参数 ..,,则 "(传递了三个参数). echo "-- \$* 演示 --" for i ...
- 【翻译】Flink Table Api & SQL —Streaming 概念 ——时间属性
本文翻译自官网: Time Attributes https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/str ...
- [LeetCode] 163. Missing Ranges 缺失区间
Given a sorted integer array nums, where the range of elements are in the inclusive range [lower, up ...