Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游
题目描述
小刘同学是一个喜欢氪金手游的男孩子。
他最近迷上了一个新游戏,游戏的内容就是不断地抽卡。现在已知:
- 卡池里总共有 \(N\) 种卡,第 \(i\) 种卡有一个权值 \(W_i\),小刘同学不知道 \(W_i\) 具体的值是什么。但是他通过和网友交流,他了解到 \(W_i\) 服从一个分布。
- 具体地,对每个 \(i\),小刘了解到三个参数 \(p_{i,1},p_{i,2},p_{i,3}\),\(W_i\) 将会以 \(p_{i,j}\) 的概率取值为 \(j\),保证 \(p_{i,1}+p_{i,2}+p_{i,3}=1\)。
小刘开始玩游戏了,他每次会氪一元钱来抽一张卡,其中抽到卡 \(i\) 的概率为:
\[\frac{W_i}{\sum_j W_j}\]
小刘会不停地抽卡,直到他手里集齐了全部 \(N\) 种卡。
抽卡结束之后,服务器记录下来了小刘第一次得到每张卡的时间 \(T_i\)。游戏公司在这里设置了一个彩蛋:公司准备了 \(N−1\) 个二元组 \((u_i,v_i)\),如果对任意的 \(i\),成立 \(T_{u_i}<T_{v_i}\),那么游戏公司就会认为小刘是极其幸运的,从而送给他一个橱柜的手办作为幸运大奖。
游戏公司为了降低获奖概率,它准备的这些 \((u_i,v_i)\) 满足这样一个性质:对于任意的 \(\varnothing\ne S\subsetneq\{1,2,\ldots,N\}\),总能找到 \((u_i,v_i)\) 满足:\(u_i\in S,v_i\notin S\) 或者 \(u_i\notin S,v_i\in S\)。
请你求出小刘同学能够得到幸运大奖的概率,可以保证结果是一个有理数,请输出它对 \(998244353\) 取模的结果。
输入格式
第一行一个整数 \(N\),表示卡的种类数。
接下来 \(N\) 行,每行三个整数 \(a_{i,1},a_{i,2},a_{i,3}\),而题目给出的 \(p_{i,j}=\frac{a_{i,j}}{a_{i,1}+a_{i,2}+a_{i,3}}\)。
接下来 \(N−1\) 行,每行两个整数 \(u_i,v_i\),描述一个二元组(意义见题目描述)。
输出格式
输出一行一个整数,表示所求概率对 \(998244353\) 取模的结果。
数据范围与提示
对于全部的测试数据,保证 \(N\le 1000\),\(a_{i,j}\le 10^6\)。
- \(20\) 分的数据,\(N\le 15\)。
- \(15\) 分的数据,\(N\le 200\),且每个限制保证 \(|u_i−v_i|=1\)。
- \(20\) 分的数据,\(N\le 1000\),且每个限制保证 \(|u_i−v_i|=1\)。
- \(15\) 分的数据,\(N\le 200\)。
- \(30\) 分的数据,无特殊限制。
参考博客
首先给出的关系构成了一棵树。
随便选一个点作为根。假设所有点的\(w\)以及确定,先考虑如果所有边都是由父亲连向儿子的情况,那么答案就是
\[ \prod_{i=1}^n\frac{w_i}{size_i} \]
其中\(size_i\)表示\(i\)的子树中\(w\)之和。考虑第\(i\)个点要成为\(i\)的子树中第一个被抽到的概率,枚举抽到\(i\)子树外的卡片的次数得到:
\[ \sum_{j=0}^{\infty}(\frac{W-size_i}{W})^j\frac{w_i}{W}\\ =\frac{w_i}{size_i} \]
从这个式子也可以看出每个点的概率是独立的。
所以我们就可以\(DP\),设\(f_{i,j}\)表示以\(i\)为根的子树中,\(size_i=j\)的概率。
对于由儿子连向父亲的边我们用容斥原理来处理。我们可以枚举一些边反向,另一些边消失,算出概率,假设\(k\)条边反向,那么容斥系数就是\((-1)^k\)。\(DP\)的时候遇到这种边就讨论一下是消失还是反向,带上容斥系数就行了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 1005using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}const ll mod=998244353;
ll ksm(ll t,ll x) {ll ans=1;for(;x;x>>=1,t=t*t%mod)if(x&1) ans=ans*t%mod;return ans;
}int n;
ll rate[N][4],a[N][4];
struct road {int to,nxt;int dir;
}s[N<<1];
int h[N],cnt;
void add(int i,int j,int d) {s[++cnt]=(road) {j,h[i],d};h[i]=cnt;}int fa[N];
ll f[N][N*3];
ll tem[N*3];
ll inv[N*3];
int size[N];void dfs(int v) {f[v][0]=1;for(int i=h[v];i;i=s[i].nxt) {int to=s[i].to;if(to==fa[v]) continue ;fa[to]=v;dfs(to);for(int j=0;j<=(size[v]+size[to])*3;j++) tem[j]=0;if(!s[i].dir) {for(int j=0;j<=size[v]*3;j++) {for(int k=0;k<=size[to]*3;k++) {(tem[j+k]+=f[v][j]*f[to][k])%=mod;}}} else {ll sum=0;for(int j=0;j<=size[to]*3;j++) (sum+=f[to][j])%=mod;for(int j=0;j<=size[v]*3;j++) tem[j]=f[v][j]*sum%mod;for(int j=0;j<=size[v]*3;j++) {for(int k=0;k<=size[to]*3;k++) {(tem[j+k]+=mod-f[v][j]*f[to][k]%mod)%=mod;}}}size[v]+=size[to];for(int j=0;j<=size[v]*3;j++) f[v][j]=tem[j];}size[v]++;for(int i=0;i<=size[v]*3;i++) tem[i]=0;for(int i=0;i<=size[v]*3;i++) {for(int j=1;j<=3;j++) {(tem[i+j]+=f[v][i]*rate[v][j]%mod*j*inv[i+j])%=mod;}}for(int i=0;i<=size[v]*3;i++) f[v][i]=tem[i];
}int main() {n=Get();inv[0]=1;for(int i=1;i<=n*3;i++) inv[i]=ksm(i,mod-2);for(int i=1;i<=n;i++) {for(int j=1;j<=3;j++) a[i][j]=Get();ll sum=a[i][1]+a[i][2]+a[i][3];for(int j=1;j<=3;j++) rate[i][j]=a[i][j]*ksm(sum,mod-2)%mod;}for(int i=1;i<n;i++) {int a=Get(),b=Get();add(a,b,0),add(b,a,1);}dfs(1);ll ans=0;for(int i=0;i<=size[1]*3;i++) (ans+=f[1][i])%=mod;cout<<ans;return 0;
}
转载于:https://www.cnblogs.com/hchhch233/p/10939507.html
Loj #3124. 「CTS2019 | CTSC2019」氪金手游相关推荐
- LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP
题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...
- LOJ#3124. 「CTS2019 | CTSC2019」氪金手游 容斥+DP
神仙容斥+DP可还行. code: #include <cstdio> #include <cmath> #include <vector> #include &l ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- #loj3124. 「CTS2019 | CTSC2019」氪金手游
简单容斥 先假设所有点的权值都给定了 随便选一个点当根开始dfs,如果所有边都是向下指的那么答案就是 \[\prod_{u}\frac{w(u)}{siz(u)}\] 其中\(siz(u)\)表示u子 ...
- 「CTS2019」氪金手游
「CTS2019」氪金手游 解题思路 考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了. 令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子 ...
- 【LOJ】#3123. 「CTS2019 | CTSC2019」重复
LOJ3123 60pts 正难则反,熟练转成总方案数减掉每个片段都大于等于s的字典序的方案 按照一般的套路建出kmp上每个点加一个字符的转移边的图(注意这个图开始字母必须是nxt链中下一个相邻的字符 ...
- 【LOJ3124】「CTS2019」氪金手游
[题目链接] 点击打开链接 [思路要点] 考虑给出的图为外向树的情况,各个点都需要早于子树中所有的点,记 sizeisize_isizei 表示 iii 子树中所有点的 wiw_iwi 之和,则获 ...
- #3120. 「CTS2019 | CTSC2019」珍珠
虽然标算是生成函数,但是我们只要头够铁就能用矩阵对角化日过去的 如果我们知道了有几个颜色出现了奇数次,我们就能够计算出这个方案合不合法 所以直接大力dp(i)表示有i个颜色出现了奇数次的方案数就行了 ...
- 【CTS2019】氪金手游(动态规划)
[CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...
最新文章
- keras和tensorflow使用 keras.callbacks.TensorBoard 可视化数据
- Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector
- python画切片图_python|Python图片常用操作-索引与切片
- LLBLGen 关于类型转换
- 使用JUnit 5进行Spring Boot测试
- 【FFMPEG系列】之查看FFMPEG版本号
- Struts(十二):异常处理:exception-mapping元素
- Campass + Scss ,让我们更优雅的编写CSS
- 家园2简易地图编辑器
- 2017计算机系书单推荐(排版更新)
- Linux 挂载Samba 设置777权限及取消挂载
- 第十七届“科大讯飞杯”题解
- 大学物理复习笔记——相对论
- 快消品企业数字化转型解决方案
- 武汉市2010年 第六次全国人口普查主要数据公报
- 【SoapUI “failed to load url” when “Error loading WSDL”】
- CIFAR-10数据集及matlab版本读取
- 戴维营教育ios笔试题一
- Linux内核:驱动程序
- [转] 为UIWebView实现离线浏览
热门文章
- 汇编语言中xor指令_XOR寄存器,寄存器(汇编程序)
- PPI_DPI 对比
- 兔子与兔子 字符串hash
- ProPresenter 6 for Mac破解版永久激活方法
- 安卓隐藏摄像_隐藏拍摄app
- LeetCode接雨水 动态规划
- 美通企业周刊 | 理想汽车提交赴美IPO文件;默克最大M Lab协作中心落户上海;百世上线东南亚门到门寄递服务...
- 中国知网论文查重算法和修改攻略
- [Canvas系列]Canvas简单线条绘制_02
- 微信麻将连接服务器失败,微乐麻将授权失败是怎么回事?微乐麻将怎么用微信登录?...