[CTS2019]氪金手游(容斥+树形背包DP)
降智好题。本蒟蒻VP时没想到怎么做被题面迷惑了,只会20分的“好”成绩。简直自闭了。
首先显然度为0的点是白给的,根据等比数列求和公式即可求得。然后考虑这个树如果是一颗外向树,就是每个点先父亲再自己。然后直接DP,令f[i][j]表示子树i内Σw=j的概率,转移时直接用背包转移一发即可。边是正向的直接转移,反向的加上去掉该限制的答案,并减去反向的答案。复杂度显然是O(n2)
#include<bits/stdc++.h> using namespace std; const int N=1019,mod=998244353; int n,cnt,ans,p[N][4],f[N][N*3],g[N*3],sz[N],inv[N*3],hd[N],v[N<<1],nxt[N<<1],w[N<<1]; void add(int&x,int y){x=x+y>=mod?x+y-mod:x+y;} int qpow(int a,int b) {int ret=1;while(b){if(b&1)ret=1ll*ret*a%mod;a=1ll*a*a%mod,b>>=1;}return ret; } void adde(int x,int y) {v[++cnt]=y,w[cnt]=1,nxt[cnt]=hd[x],hd[x]=cnt;v[++cnt]=x,w[cnt]=0,nxt[cnt]=hd[y],hd[y]=cnt; } void dfs(int u,int fa) {f[u][0]=1;for(int i=hd[u];i;i=nxt[i])if(v[i]!=fa){dfs(v[i],u);for(int j=0;j<=sz[u]+sz[v[i]];j++)g[j]=0;for(int j=0;j<=sz[u];j++)for(int k=0;k<=sz[v[i]];k++){int val=1ll*f[u][j]*f[v[i]][k]%mod;if(w[i])add(g[j+k],val);else add(g[j+k],mod-val),add(g[j],val);}sz[u]+=sz[v[i]];for(int j=0;j<=sz[u];j++)f[u][j]=g[j];}memset(g,0,sizeof g);for(int i=0;i<=sz[u];i++)for(int j=1;j<=3;j++)add(g[i+j],1ll*f[u][i]*p[u][j]%mod*j%mod*inv[i+j]%mod);sz[u]+=3;for(int i=0;i<=sz[u];i++)f[u][i]=g[i]; } int main() {scanf("%d",&n);for(int i=1,x,y,z,sum;i<=n;i++){scanf("%d%d%d",&x,&y,&z);sum=qpow(x+y+z,mod-2);p[i][1]=1ll*x*sum%mod,p[i][2]=1ll*y*sum%mod,p[i][3]=1ll*z*sum%mod;}inv[0]=inv[1]=1;for(int i=2;i<=n*3;i++)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),adde(x,y);dfs(1,0);for(int i=0;i<=3*n;i++)add(ans,f[1][i]);printf("%d",ans); }
View Code
转载于:https://www.cnblogs.com/hfctf0210/p/10901589.html
[CTS2019]氪金手游(容斥+树形背包DP)相关推荐
- Luogu5405 CTS2019氪金手游(容斥原理+树形dp)
考虑外向树怎么做.显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可. 如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率.于是考虑容斥 ...
- [LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)
Address 洛谷 P5405 LOJ #3124 Solution 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv ...
- LOJ#3124. 「CTS2019 | CTSC2019」氪金手游 容斥+DP
神仙容斥+DP可还行. code: #include <cstdio> #include <cmath> #include <vector> #include &l ...
- P5405 [CTS2019]氪金手游 【数学概率+树形dp】
P5405 [CTS2019]氪金手游 [数学概率+树形dp] 先考虑外向树的情况: 这个的关键是要把求满足拓扑序的概率转化为求 每个点都比它的子树中的所有节点先取到的概率 .单个节点 xxx 的概率 ...
- [CTS2019]氪金手游 概率Dp,树形Dp,容斥原理
[CTS2019]氪金手游 题目传送门: luogu 分析 先考虑一下那个奇怪的条件(都知道是哪个吧) 它实际上是说,整个结构形成了一棵树. 但是这棵树很奇怪,边有顺的也有反的. 先考虑全是顺的边的情 ...
- CTS2019 氪金手游
题目链接 考虑我们现在只会外向树的dp,现在想办法如何处理反向的边. 考虑容斥,计算至少有\(i\)条边不合法的情况,容斥系数是\((-1)^i\) 这个容斥可以用dp来做,这题就完了. 代码 #in ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)
先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...
- [CTS2019]氪金手游
https://www.luogu.org/problemnew/show/P5405 题解 首先考虑一条链的情况. \(O->O->O->O->O\) 比如说这样一条链. 每 ...
最新文章
- 串口监视软件_ESP32 Arduino教程:软件重置
- HDU.4903.The only survival(组合 计数)
- mongodb android,如何在Android中连接到MongoDB数据库?
- Tracer cannot set value trace for type None. Supported types are tensor, tensor list, and tuple
- cvpr2019/cvpr2018/cvpr2017(Papers/Codes/Project/Paper reading)
- 笔记本用无线路由器上网设置教程攻略
- redis实现轮询算法_【07期】Redis中是如何实现分布式锁的?
- sap的ides和ecc分别是什么意思
- HTML5跑酷网页游戏源码
- 专业设计师是哪里找到高质量素材的!
- IOCP模型TCP服务器
- Windows Notepad 居然要迎来大更新了!
- mysql主从数据库服务器搭建
- 用Not Exists 代替Not In
- 基于图灵api的Python机器人
- 2020-10-22
- 使用dd命令修改bin文件
- 局域网oracle 速度慢,[转帖]局域网中其他用户感觉上网速度慢、网速卡
- 不同手机型号图文预览_各种手机型号的查询方法(国外英文资料).doc
- 离散数学 数学三大危机
热门文章
- K-Means聚类算法原理及其python和matlab实现
- 荣耀8/16-年月日转换
- SpringBoot使用easyexcel打印数据
- python中def _init_是什么意思_python3类中的def __init()__如何使用?
- 解决to_csv循环追加数据不会覆盖前面的数据
- php支付宝pc收银台,支付宝支付-PC电脑网站支付
- 红楼解梦五--饥饿疗法
- 九寨沟静态页面(html+css)
- 使用plugman开发cordova 高德地图定位插件
- 生成式对抗网络(GAN)原理推导与网络构建思路