「CTS2019」氪金手游

解题思路

考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了。

令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子树,子树内 \(\sum w=i\) 的合法概率,可以简单证明子树外的选取是不影响子树内的答案的,所以可以这样表示。

证明:我们只考虑子树内的第一个选出根节点 \(u\) 的概率是 \(\frac{w_u}{i}\),假设当前未被选走的卡的概率之和为 \(S\) ,那么考虑全部未被选走的卡,子树内第一个选走 \(u\) 的概率为

\[\dfrac{w_u}{S}\sum_{k=0}^{\infty} (\dfrac{S-i}{S})^k
=\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」氪金手游的更多相关文章

  1. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  2. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

  3. 【CTS2019】氪金手游(动态规划)

    [CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...

  4. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP

    题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...

  5. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  6. [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】

    Description Solution 首先它的限制关系是一个树形图 首先考虑如果它是一个外向树该怎么做. 这是很简单的,我们相当于每个子树的根都是子树中最早出现的点,概率是容易计算的. 设DP状态 ...

  7. [LOJ3124][CTS2019|CTSC2019]氪金手游:树形DP+概率DP+容斥原理

    分析 首先容易得出这样一个事实,在若干物品中最先被选出的是编号为\(i\)的物品的概率为\(\frac{W_i}{\sum_{j=1}^{cnt}W_j}\). 假设树是一棵外向树,即父亲比儿子先选( ...

  8. [CTS2019]氪金手游

    [CTS2019]氪金手游 各种情况加在一起 先考虑弱化版:外向树,wi确定 i合法的概率就是wi/sw sw表示子树的w的和,和子树外情况无关 这些概率乘起来就是最终合法的概率 如果都是外向树, f ...

  9. 「UOJ207」共价大爷游长沙

    「UOJ207」共价大爷游长沙 解题思路 : 快速判断两个集合是否完全相等可以随机点权 \(\text{xor}\) 的思路可以用到这道题上面,给每一条路径随机一个点权,维护出经过每一条边的点权的 \ ...

随机推荐

  1. pytorch中tensor数据和numpy数据转换中注意的一个问题

    转载自:(pytorch中tensor数据和numpy数据转换中注意的一个问题)[https://blog.csdn.net/nihate/article/details/82791277] 在pyt ...

  2. nginx重启 平滑重启

    进入 ngiinx sbin目录下./nginx -c /usr/local/nginx/conf/nginx.conf -c参数指定了要加载的nginx配置文件路径 停止操作停止操作是通过向ngin ...

  3. Nessus简单使用

    1.更新插件 上次搭建完后总觉得不踏实,因为老是提示插件多久没更新了,然后果断花了1.25美刀买了台vps,终于把最新的插件下载下来了,总共190M,需要的QQ私信我.

  4. GIT 安装和升级

    git 安装: http://git-scm.com/download/mac git 升级: $ git clone git://git.kernel.org/pub/scm/git/git.git

  5. 15、基于consul+consul-template+registrator+nginx实现自动服务发现

    一.架构图 二.组件介绍 1.Registrator Registrator:一个由Go语言编写的,针对docker使用的,通过检查本机容器进程在线或者停止运行状态,去注册服务的工具.所以我们要做的实 ...

  6. 微信小程序之数据缓存

    关于缓存,举个示例,假定我不是通过微信授权登录的方式,小程序又是如何识别我登录后的身份呢???效果图: 这个功能我是通过缓存实现的. 关键核心代码如下: wx.setStorage({ key: 'u ...

  7. python 运行当前目录下的所有文件

     查看当前目录下所有py文件(本身除外run) import os file_list = os.listdir(os.getcwd()) # 获取当前目录下所有的文件名print(file_list ...

  8. Server 2003 操作系统位数

    安装好电脑系统,如何查看windows 2003/xp/win7是64位还是32位? 方法/步骤 第一种方法:桌面上鼠标右键单击“计算机”(我的电脑) 在弹出的快捷菜单中选择“属性”,如果看到64的字 ...

  9. curl保留cookie

    curl -c cookie.txt http://localhost:9001/login.json?c=65CE13E16CF394D curl -b @cookie.txt http://loc ...

  10. Python script to package the information of tracking benchmarks like LaSOT and GOT-10k into json files for Siamese network based trackers

    ############################################################################################ #### Fo ...