📌  相关文章
📜  使得两个子集包含相同数量元素的概率(1)

📅  最后修改于: 2023-12-03 15:36:26.131000             🧑  作者: Mango

使得两个子集包含相同数量元素的概率

本题有多种解法,下面将介绍其中一种。设集合大小为 $n$,从中随机选出 $m$ 个元素,将它们分为两个子集 $A$ 和 $B$。我们的目标是求 $|A| = |B|$ 的概率。

我们可以将 $m$ 个元素全部编号,那么总共有 $2^m$ 种分配方式。我们可以枚举 $A$ 包含哪些编号的元素,假设包含了编号为 $a_1, a_2, \dots, a_k$ 的 $k$ 个元素,则有 $|A| = k$。那么 $B$ 包含的元素的编号自然就是 $1,2,\dots,m$ 中不属于 $a_1, a_2, \dots, a_k$ 的那些编号。

因此,对于任意 $A$,我们都可以唯一地确定出 $B$。而 $|A| = k$ 的概率是 $\binom{m}{k}/2^m$(即从 $m$ 个编号中选出 $k$ 个编号的组合数除以总共的方案数 $2^m$)。于是,$|A| = |B|$ 的概率就是

$$ \begin{aligned} &\sum_{k=0}^{m/2} \binom{m}{k}/2^m \cdot \binom{m}{k}/2^m \ =&\frac{1}{4^m}\sum_{k=0}^{m/2} \binom{m}{k}^2 \end{aligned} $$

这个表达式中,$\binom{m}{k}^2$ 可以用类似于计算卷积的方法 $O(m\log m)$ 地求出来。而 $\sum_{k=0}^{m/2} \binom{m}{k}^2$ 的值可以用 Vandermonde 恒等式证明是 $\binom{2m}{m}$。因此,最终的概率是

$$ \frac{\binom{2m}{m}}{4^m} $$

这个表达式中,$\binom{2m}{m}$ 可以用 $O(m\log m)$ 的时间求出来。因此,总时间复杂度是 $O(m\log m)$。

下面是 Python 代码片段:

import math

def probability(n, m):
    return math.comb(2 * m, m) / 4**m

# 示例
print(probability(6, 3)) # 输出 0.3125