[CTS2019]氪金手游(容斥+树形背包DP)
降智好题。本蒟蒻VP时没想到怎么做被题面迷惑了,只会20分的“好”成绩。简直自闭了。
首先显然度为0的点是白给的,根据等比数列求和公式即可求得。然后考虑这个树如果是一颗外向树,就是每个点先父亲再自己。然后直接DP,令f[i][j]表示子树i内Σw=j的概率,转移时直接用背包转移一发即可。边是正向的直接转移,反向的加上去掉该限制的答案,并减去反向的答案。复杂度显然是O(n2)
#include<bits/stdc++.h>
using namespace std;
const int N=,mod=;
int n,cnt,ans,p[N][],f[N][N*],g[N*],sz[N],inv[N*],hd[N],v[N<<],nxt[N<<],w[N<<];
void add(int&x,int y){x=x+y>=mod?x+y-mod:x+y;}
int qpow(int a,int b)
{
int ret=;
while(b)
{
if(b&)ret=1ll*ret*a%mod;
a=1ll*a*a%mod,b>>=;
}
return ret;
}
void adde(int x,int y)
{
v[++cnt]=y,w[cnt]=,nxt[cnt]=hd[x],hd[x]=cnt;
v[++cnt]=x,w[cnt]=,nxt[cnt]=hd[y],hd[y]=cnt;
}
void dfs(int u,int fa)
{
f[u][]=;
for(int i=hd[u];i;i=nxt[i])
if(v[i]!=fa)
{
dfs(v[i],u);
for(int j=;j<=sz[u]+sz[v[i]];j++)g[j]=;
for(int j=;j<=sz[u];j++)
for(int k=;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=;j<=sz[u];j++)f[u][j]=g[j];
}
memset(g,,sizeof g);
for(int i=;i<=sz[u];i++)
for(int j=;j<=;j++)
add(g[i+j],1ll*f[u][i]*p[u][j]%mod*j%mod*inv[i+j]%mod);
sz[u]+=;
for(int i=;i<=sz[u];i++)f[u][i]=g[i];
}
int main()
{
scanf("%d",&n);
for(int i=,x,y,z,sum;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&z);
sum=qpow(x+y+z,mod-);
p[i][]=1ll*x*sum%mod,p[i][]=1ll*y*sum%mod,p[i][]=1ll*z*sum%mod;
}
inv[]=inv[]=;for(int i=;i<=n*;i++)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=,x,y;i<n;i++)scanf("%d%d",&x,&y),adde(x,y);
dfs(,);
for(int i=;i<=*n;i++)add(ans,f[][i]);
printf("%d",ans);
}
[CTS2019]氪金手游(容斥+树形背包DP)的更多相关文章
- Luogu5405 CTS2019氪金手游(容斥原理+树形dp)
考虑外向树怎么做.显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可. 如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率.于是考虑容斥 ...
- [CTS2019]氪金手游
[CTS2019]氪金手游 各种情况加在一起 先考虑弱化版:外向树,wi确定 i合法的概率就是wi/sw sw表示子树的w的和,和子树外情况无关 这些概率乘起来就是最终合法的概率 如果都是外向树, f ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- [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 ...
- p5405 [CTS2019]氪金手游
题目大意 题意狗屁不通 看毛子语都比看这个题面强 分析 我们假设这棵树是一个内向树 那么我们可以轻易的得到dp[x][i]表示x点子树和为i的期望 转移只需枚举当前期望大小和子树期望大小即可 但是由于 ...
- 【题解】Luogu P5405 [CTS2019]氪金手游
原题传送门 我们珂以先考虑一条链的情况,设\(sum\)为所有\(w_i\)的总和,\(Sw_i\)表示\(\sum_{j=i}^nw_i\) \[1 \rightarrow 2 \rightarro ...
- 「CTS2019」氪金手游
「CTS2019」氪金手游 解题思路 考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了. 令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子 ...
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
随机推荐
- DispatcherServlet (1)
阅读DispatcherServlet源码和<Spring解密>第二十三章 总结 之前对SpringMVC处理请求模糊不清,本周阅读了DispatcherServlet源码,对这一部分有了 ...
- 快速幂的类似问题(51Nod 1008 N的阶乘 mod P)
下面我们来看一个容易让人蒙圈的问题:N的阶乘 mod P. 51Nod 1008 N的阶乘 mod P 看到这个可能有的人会想起快速幂,快速幂是N的M次方 mod P,这里可能你就要说你不会做了,其实 ...
- JS实现时间选择器
源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- 在VS中编写Qt5涉及到的一点字符串问题
在VS中开发Qt5程序似乎成了我的一种习惯,因为觉得VS简直不能再溜了,不愧是"宇宙第一IDE". 所以在开发中难免会遇到中文显示乱码的问题,网上找到的很多方法都是类似于下面这样的 ...
- grid布局——从入门到放弃
基本知识 CSS grid 布局有两个核心组成部分:wrapper(网格容器,父元素)和items(网格项,子元素). 基本属性 属性 含义 display: grid 网格布局(父元素设置) gri ...
- 程序中出现list assignment index out of range的解决方法
class stack: def __init__(self): self.num = 0 self.elem=[] def isEmoty(self): if self.num == 0: prin ...
- elasticsearch-集群管理
1.集群结构 ES 通常以集群方式工作.以提高搜索性能.容错能力.高可用.实现PB级数据搜索. 相关概念: (1)结点: ES集群由多台ES服务器组成.每个ES 服务端就是个一个NODE结点 (2)分 ...
- 图论中TSP问题的LINGO求解与应用
巡回旅行商问题(Traveling Salesman Problem,TSP),也称为货郎担问题.该问题可简单描述为走遍n个城市的最短路.几十年来,出现了很多近似优化算法.如近邻法.贪心算法.最近插入 ...
- Django框架(十一):模板介绍、模板语言、模板继承、HTML转义
1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页 ...
- 为什么常用 Map<> map = new HashMap()
在初学Java的时候,经常能看到教材上的写法,使用了接口Map来引用一个map,而不是它的具体实现,那么这样做的好处是什么呢? <Effective Java>第52条:通过接口引用对象 ...