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


Solution
首先它的限制关系是一个树形图
首先考虑如果它是一个外向树该怎么做。
这是很简单的,我们相当于每个子树的根都是子树中最早出现的点,概率是容易计算的。
设DP状态\(f[i][j]\)为做到以i为根的子树,子树中权值W的和为j且满足限制关系的概率。
然后就可以直接利用子树背包DP来转移了。
如果有些边是反向(儿子到父亲)的,我们可以通过容斥来把这些边反过来,要么是彻底没有这条边的限制,要么是反向变成父亲到儿子方向,系数乘一个(-1)即可。
具体可以参考代码。
Code
#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
#define N 1005
#define LL long long
#define mo 998244353
using namespace std;
int n,fs[N],nt[2*N],dt[2*N],sz[N],m1;
LL ny[N],ap[N][4],f[N][3*N],pr[2*N],g[3*N],np[3*N];
LL ksm(LL k,LL n)
{
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
void link(int x,int y)
{
nt[++m1]=fs[x];
dt[fs[x]=m1]=y;
}
void dfs(int k,int fa)
{
f[k][0]=1;
for(int i=fs[k];i;i=nt[i])
{
int p=dt[i];
if(p!=fa)
{
dfs(p,k);
fo(x,0,3*sz[k])
fo(y,1,3*sz[p])
{
(g[x+y]+=f[k][x]*f[p][y]%mo*pr[i]%mo)%=mo;
if(pr[i]==mo-1) (g[x]+=f[k][x]*f[p][y]%mo)%=mo;
}
sz[k]+=sz[p];
fo(j,0,3*sz[k]) f[k][j]=g[j],g[j]=0;
}
}
sz[k]++;
fod(i,3*sz[k],0)
{
f[k][i]=0;
fo(j,1,3) if(i>=j) (f[k][i]+=f[k][i-j]*ny[k]%mo*ap[k][j]%mo*np[i]%mo*(LL)j%mo)%=mo;
}
}
int main()
{
cin>>n;
fo(i,1,n)
{
fo(j,1,3) scanf("%d",&ap[i][j]),ny[i]+=ap[i][j];
ny[i]=ksm(ny[i]%mo,mo-2);
}
fo(i,1,3*n) np[i]=ksm(i,mo-2);
fo(i,1,n-1)
{
int x,y;
scanf("%d%d",&x,&y);
link(x,y),link(y,x);
pr[m1-1]=1,pr[m1]=mo-1;
}
dfs(1,0);
LL ans=0;
fo(i,1,3*n) (ans+=f[1][i])%=mo;
printf("%lld\n",ans);
}
[LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】的更多相关文章
- [CTS2019]氪金手游
[CTS2019]氪金手游 各种情况加在一起 先考虑弱化版:外向树,wi确定 i合法的概率就是wi/sw sw表示子树的w的和,和子树外情况无关 这些概率乘起来就是最终合法的概率 如果都是外向树, f ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- 【题解】Luogu P5405 [CTS2019]氪金手游
原题传送门 我们珂以先考虑一条链的情况,设\(sum\)为所有\(w_i\)的总和,\(Sw_i\)表示\(\sum_{j=i}^nw_i\) \[1 \rightarrow 2 \rightarro ...
- Luogu5405 CTS2019氪金手游(容斥原理+树形dp)
考虑外向树怎么做.显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可. 如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率.于是考虑容斥 ...
- [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)
先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...
- 题解-CTS2019氪金手游
Problem \(\mathtt {loj-3124}\) 题意概要:给定 \(n\) 个点,\(w_i\) 分别有 \(p_{i,1},p_{i,2},p_{i,3}\) 的概率取 \(1,2,3 ...
- [CTS2019]氪金手游(容斥+树形背包DP)
降智好题.本蒟蒻VP时没想到怎么做被题面迷惑了,只会20分的“好”成绩.简直自闭了. 首先显然度为0的点是白给的,根据等比数列求和公式即可求得.然后考虑这个树如果是一颗外向树,就是每个点先父亲再自己. ...
- p5405 [CTS2019]氪金手游
题目大意 题意狗屁不通 看毛子语都比看这个题面强 分析 我们假设这棵树是一个内向树 那么我们可以轻易的得到dp[x][i]表示x点子树和为i的期望 转移只需枚举当前期望大小和子树期望大小即可 但是由于 ...
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- 【CTS2019】氪金手游(动态规划)
[CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...
随机推荐
- oracle 插入数据之坑--------oracle字符类型varchar2一个中文占多少字节
如果你误认为是两个字节,那就大错特错了 Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定 查看oracle server端字符集 select userenv('langu ...
- 手写一个python迭代器
分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...
- 使用Python基于OpenCV的验证码识别
Blog:https://blog.csdn.net/qq_40962368/article/details/89312429(Verification_Code_Identification) 步骤 ...
- js获取url上的指定参数
function getAllUrlParams(url) { // get query string from url (optional) or window var queryString = ...
- SqlSugar
SqlSugar 官网 SqlSugar 源码 SqlSugar NuGet
- 107、如何配置 Health Check ? (Swarm14)
参考https://www.cnblogs.com/CloudMan6/p/8053323.html 容器状态是UP的,那应用就是健康的吗? 不一定 Docker 只能从容器启动进程的返 ...
- LintCode 64---合并排序数组
public class Solution { /* * @param A: sorted integer array A which has m elements, but size of A is ...
- springboot(十九)-线程池的使用
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行. 话不多说,编码开始: 1.创建spri ...
- 进程管理工具之supervisor[详解]
原文链接:https://blog.csdn.net/weixin_42390791/article/details/88866237 一.问题背景1.背景 如何才能让一个进程摆脱终端,获得相对 ...
- filepath:处理文件路径的一把好手
1.ToSlash(path string) string 将相关平台的路径分隔符转为/ package main import ( "fmt" "os" &q ...