1 条题解
-
0
题意理解
有 种卡,第 种卡的权值 以概率 取值为 。
抽卡概率与权值成正比:
抽到全部 种卡停止,记录第一次获得每种卡的时间 。
有 个条件 ,且这些条件构成一棵树。
求满足所有条件的概率。
核心难点
- 随机权值: 是随机的,需要枚举所有可能性
- 条件概率: 在随机抽卡下的概率
- 树形约束:所有条件构成一棵树
- 模运算:对 取模
关键思路:容斥原理 + 树形DP
第一步:分析单个条件
对于条件 ,在已知所有卡权值的情况下,这个条件成立的概率是多少?
重要结论:在抽卡过程中, 的概率等于
直观理解:考虑第一次抽到 或 的时刻,抽到 的概率就是 。
第二步:处理多个条件
所有条件构成一棵树,我们需要所有条件同时成立的概率。
设 表示权值配置为 时所有条件成立的概率,则:
总概率为:
其中 是权值配置 的概率。
第三步:容斥原理
直接计算所有条件成立很困难,考虑容斥:
设 表示至少违反边集 中的条件的概率。
由容斥原理:
$$P(\text{所有条件成立}) = \sum_{T \subseteq E} (-1)^{|T|} f(T) $$如果违反边 ,意味着 。
第四步:关键观察
定理:如果违反的边集 包含环,则 。
因为时间关系不能形成环路。
所以只需考虑 是森林的情况。
又因为原图是树, 是原图的子集,所以 也是森林。
第五步:树形DP
设 表示以 为根的子树, 的连通块大小为 的概率贡献。
这里"连通块"指的是:如果违反父子边,则断开;否则连通。
转移时考虑边 :
- 不违反: 和 连通,合并连通块
- 违反: 和 不连通, 自成一体
第六步:概率计算
对于边 :
- 不违反的概率:
- 违反的概率:
在 DP 中,我们需要对 的所有可能取值进行积分。
算法框架
状态设计
:考虑 的子树, 所在连通块大小为 的概率贡献(已经考虑了容斥系数)。
初始化
对于叶子 ,
转移
合并子树 到 :
对于 和 :
-
不违反边 (连通):
$$\text{贡献} = dp[u][i] \times dp[v][j] \times \frac{W_u}{W_u + W_v} \times \frac{\binom{i+j-2}{i-1}}{\binom{i+j}{i}} $$组合数是因为需要混合两个抽卡序列。
-
违反边 (断开):
$$\text{贡献} = dp[u][i] \times dp[v][j] \times \frac{W_v}{W_u + W_v} \times (-1) $$容斥系数
最终答案
关键优化
- 生成函数:用生成函数表示连通块大小分布,用 NTT 加速卷积
- 预处理积分:预处理 等值
- 树上背包:经典的 树形 DP
复杂度分析
- 朴素 DP:
- 用生成函数优化:
- 对于 可接受
总结
这道题的核心在于:
- 将时间关系转化为概率公式: 的概率 =
- 容斥原理:处理多个条件约束
- 树形DP:在树上统计各种违反情况的概率
- 生成函数:优化连通块大小的合并
通过将复杂的抽卡过程转化为树形结构上的概率计算,再利用动态规划高效求解,就能得到精确的概率值。
- 1
信息
- ID
- 3800
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者