「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游
降 智 好 题 ...
考场上签到失败了,没想容斥就只打了20分暴力...
考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中度为0的点)
删掉就是字面意思,就是剩下的树变成子问题
考虑为什么,在抽中这个\(i\)号点后,抽中其他点的概率为
\]
说明这个点已经白给了
然后考虑这个树如果是一颗外向树,就是每个点先父亲再自己
有个比较显然的dp,令\(dp_{i,j}\)表示子树\(i\)的\(\sum w=j\)时的概率,转移的时候合并一下子树就好了
然后考虑到,树上一条边相当于一个限制,如果我们去掉这个限制,会多统计一些东西,但是也可以发现,这个多统计的东西就是把边反向的答案...
还是令\(dp_{i,j}\)代表刚刚那个
如果边正向就正常转移
如果反向,就加上去掉限制的再减掉反向的答案(注意到去掉限制的是独立的,我们不需要改变\(W\),只是给他合并一下)
Code:
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using std::min;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
const int mod=998244353;
int inline add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
#define mul(x,y) (1ll*(x)*(y)%mod)
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
const int N=1e3+10;
int n,p[N][4],dp[N][N*3],tmp[N*3],siz[N],inv[N*3];
int head[N],to[N<<1],Next[N<<1],type[N<<1],cnt;
void addedge(int u,int v)
{
to[++cnt]=v,type[cnt]=1,Next[cnt]=head[u],head[u]=cnt;
to[++cnt]=u,type[cnt]=0,Next[cnt]=head[v],head[v]=cnt;
}
void dfs(int now,int fa)
{
dp[now][0]=1;
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])!=fa)
{
dfs(v,now);
memset(tmp,0,sizeof tmp);
for(int j=0;j<=siz[now];j++)
for(int k=0;k<=siz[v];k++)
{
int aya=mul(dp[now][j],dp[v][k]);
if(type[i])
tmp[j+k]=add(tmp[j+k],aya);
else
{
tmp[j+k]=add(tmp[j+k],mod-aya);
tmp[j]=add(tmp[j],aya);
}
}
siz[now]+=siz[v];
for(int j=0;j<=siz[now];j++) dp[now][j]=tmp[j];
}
memset(tmp,0,sizeof tmp);
for(int i=0;i<=siz[now];i++)
for(int j=1;j<=3;j++)
tmp[i+j]=add(tmp[i+j],mul(dp[now][i],mul(p[now][j],mul(j,inv[i+j]))));
siz[now]+=3;
for(int i=0;i<=siz[now];i++)
dp[now][i]=tmp[i];
}
int main()
{
read(n);
for(int a1,a2,a3,i=1;i<=n;i++)
{
read(a1),read(a2),read(a3);
int sum=qp(a1+a2+a3,mod-2);
p[i][1]=mul(a1,sum);
p[i][2]=mul(a2,sum);
p[i][3]=mul(a3,sum);
}
inv[0]=1;
for(int i=1;i<=n*3;i++) inv[i]=qp(i,mod-2);
for(int u,v,i=1;i<n;i++)
{
read(u),read(v);
addedge(u,v);
}
dfs(1,0);
int ans=0;
for(int i=0;i<=3*n;i++) ans=add(ans,dp[1][i]);
printf("%d\n",ans);
return 0;
}
2019.5.20
「CTS2019 | CTSC2019」氪金手游 解题报告的更多相关文章
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP
题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...
- 「CTS2019」氪金手游
「CTS2019」氪金手游 解题思路 考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了. 令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子 ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- 【LOJ】#3121. 「CTS2019 | CTSC2019」无处安放
第一次有耐心去研究一道题答-- 以前看到题答要么扔要么就水能简单手玩出来的 1 2可以手玩出来,快乐! 4呢发现3 3比较格路,就把3 3都配了,一边带个4的除了4 4都塞满这么放进去,然后把一边带2 ...
- LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体
题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...
- LOJ 3120: 洛谷 P5401: 「CTS2019 | CTSC2019」珍珠
题目传送门:LOJ #3120. 题意简述: 称一个长度为 \(n\),元素取值为 \([1,D]\) 的整数序列是合法的,当且仅当其中能够选出至少 \(m\) 对相同元素(不能重复选出元素). 问合 ...
- loj3120 「CTS2019 | CTSC2019」珍珠
link .... 感觉自己太颓废了....还是来更题解吧...[话说写博客会不会涨 rp 啊 qaq ? 题意: 有 n 个物品,每个都有一个 [1,D] 中随机的颜色,相同颜色的两个物品可以配对. ...
随机推荐
- 每天一个linux命令:file(11)
file file命令用来探测给定文件的类型.file命令对文件的检查分为文件系统.魔法幻数检查和语言检查3个过程. 格式 file [选项] [参数] 参数选项 参数 备注 -b 列出辨识结果时,不 ...
- 微信小程序 摇一摇
本次案例是有一点像微信的那个摇一摇但是没有那么好看,一些APP也有看到摇一摇功能. 小程序虽然没有提供摇一摇API接口,但是也一个加速器API ,加上搜索一些大神的资料,我这里就做了一个dome, ...
- Windows最值得安装的小众软件
用电脑这么久,也琢磨出自己的一些使用心得.今天和大家分享几个Windows效率工具.数量不多,但每个都是精品. ▌软件下载-卫星公众好「悦享软件」,在后台会话框中回复关键字:h108 1.Ditto ...
- linux系统一些信息(待整理)
Linux查看物理CPU个数.核数.逻辑CPU个数 复制代码 # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 ...
- IDEA2019.1.3最新破解方式
版本2019.1.3 1.下载破解JAR,放入IDEA的bin文件夹中 链接:https://pan.baidu.com/s/1N1BHeJ0-mmFIWbrh5h4k-g 提取码:g ...
- CSS入门之盒模型(六分之四)
盒模型要点知识 务必注意看,这可是前端面试 必定会遇到 的问题. box-sizing 盒模型的主要CSS属性,除继承外有两个值: content-box 这里不再细说历史原因,只说其作用. cont ...
- 线程同步(基于java)
java线程 同步与异步 线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成 ...
- HTML-参考手册: HTML 音频/视频
ylbtech-HTML-参考手册: HTML 音频/视频 1.返回顶部 1. HTML 音频/视频 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> ...
- 微信支付(JsApi)
这两天有个小项目用的微信网页jsapi支付 用的thinkphp框架开发 ,首次做微信支付 碰了很多壁,做了简单就记录,方便回顾 也希望对大家能有点帮助,也希望路过的大神批评指正.. 一.必备条件及相 ...
- StaticInjectorError[Http]:
报错:AppComponent.html:28 ERROR Error: StaticInjectorError[Http]: StaticInjectorError[Http]: 解决方法: