组合数学
组合数学
前置知识
杂项
上指标前缀和:\(\sum_{i = 0}^n \binom{i}{m} = \binom{n + 1}{m + 1}\)。
证明:
右边是 \(1 \sim n + 1\) 选 \(m + 1\) 个的方案,考虑每次枚举最大值,就是左边的方案数。
范德蒙德卷积:\(\sum_{i = 0}^k \binom{m}{i} \binom{n}{k - i} = \binom{n + m}{k}\)。
证明:
\(\sum_{k = 0}^{n + m} \binom{n + m}{k}x^k = (x + 1)^{n + m} = (x + 1)^n(x + 1)^m\)
然后再用二项式定理拆开即可证明。
从组合意义上考虑,相当于 \(n +m\) 个数中第一次选 \(i\) 个,第二次选 \(k - i\) 个的方案数的和。
Lucas 定理:在模 \(p\) 意义下,\(\binom{n}{m} = \binom{n \bmod p}{m \bmod p}\binom{n / p}{m / p}\),不会证明。
二项式反演
二项式反演:\(g_n = \sum_{i = 0}^n \binom{n}{i}f_i \Leftrightarrow f_n = \sum_{i = 0}^n(-1)^{n - i}\binom{n}{i}g_i\),\(g_k = \sum_{i = k}^n \binom{i}{k}f_i \Leftrightarrow f_k = \sum_{i = k}^n(-1)^{i - k}\binom{i}{k}g_i\)。
证明:
这里仅对于第一个式子做出部分证明。
\[\begin{align} f_n &= \sum_{i = 0}^n(-1)^{n - i}\binom{n}{i}\sum_{j = 0}^i\binom{i}{j}f_j \\ &= \sum_{j = 0}^n\sum_{i = j}^n\binom{n}{i}(-1)^{n - i}\binom{i}{j}f_j \\ &= \sum_{j = 0}^n f_j \binom{n}{j} \sum_{i = j}^n (-1)^{n - i}\binom{n - j}{i - j} \\ &= \sum_{j = 0}^n f_j \binom{n}{j} \sum_{i = 0}^{n - j} (-1)^{n - i - j} 1^{i} \binom{n - j}{i} \\ &= \sum_{j = 0}^n f_j\binom{n}{j}[n = j] \\ &= f_n \end{align} \]
min-max 容斥
min-max 容斥:\(\underset{i\in S}{\max} x_i = \sum_{T \subseteq S} (-1)^{|T| - 1} \underset{j \in T}{\min}(x_j)\),\(\min\) 同理。
证明:
令 \(f : x \mapsto \{1, 2, \cdots, k\}\),其中 \(k\) 为 \(x\) 在数组中的的位次。此时显然形成了一个双射。
有
\[\begin{align} f(\max x_i) &= \left |\bigcup f(x_i) \right | \\ &= \sum_{T \subseteq S} (-1)^{|T| - 1}\left |\bigcap f(x_j)\right | \\ &= \sum_{T \subseteq S} (-1)^{|T| - 1} f(\min x_j) \end{align} \]
比较重要的是 min-max 容斥可以推广到期望上,即有:
还能够更加加强,有:
期望同理加强。
第二类斯特林数
定义 \(S(n, m)\) 为 \(n\) 个不 同的数放入 \(m\) 个集合且集合非空的方案数,即第二类斯大林数。
则根据组合意义有递推式:\(S(n, m) = S(n - 1, m - 1) + mS(n - 1, m)\)。
考虑将 \(n\) 个不同的数放入 \(m\) 个集合(可空)的方案数为 \(m^n\),同样可以是 \(\sum_{i = 0}^m\binom{m}{i}S(n, i)i!\)。
二项式反演一下可以得到 \(S(n, m) = \sum_{i = 0}^m\frac{(-1)^{m - i}i^n}{i!(m - i)!}\)。
喵喵题目
P7481
考虑将 \(F(a + 1, b)\) 移一下位置就可以递推了。需要线性求逆元。
loj6300
【题解】LOJ6300. 「CodePlus 2018 3 月赛」博弈论与概率统计 - はなこくん - 博客园
P4859
CSP2025T4 的套路。
先排序,考虑如果此时选了一个比 \(i\) 小的东西那么 \(i\) 往后的决策少了一种,否则就比较难办了。于是我们先钦定一些位置选择比自己大的。
设 \(f_{i, j}\) 为前 \(i\) 个其中 \(j\) 个位置选择了小的,转移 \(f_{i,j} \leftarrow f_{i - 1, j} + f_{i - 1, j - 1}(pre_i - j + 1)\),其中 \(pre_i\) 为比 \(a_i\) 小的 \(b\) 的数量。
令 \(g_i = (n - i)!f_{n, i}\),此时得到的答案是至少 \(i\) 个的。那么 \(g_k = \sum_{i = k}^n \binom{i}{k}ans_i\),二项式反演一下有 \(ans_k = \sum_{i=k}^n(-1)^{i - k}\binom{i}{k}g_i\)。
P4707
P6620
即将 \(k^i\) 用第二类斯特林数拆开然后凑出一个二项式定理的形式优化计算。
直接递推求第二类斯特林数即可,\(O(m^2)\)。
ARC118E
如果我们是确定了一个排列再计数路径那一次至少 \(O(n)\) 没什么前途,所以考虑以路径为主体。
直接做比较困难,我们考虑钦定一些点必须对应 \((i, p_i)\),可以进行容斥,容斥系数为 \((-1)\) 的钦定数次方。
令 \(f_{i, j, k, p, q}\) 为当前位于 \((i, j)\),钦定了 \(k\) 个点,当前行和当前列是否有选的系数和。最后还要再乘上 \((n - k)!\)。
P3349
比较套路。
考虑状压,设 \(f_{x, y, S}\) 表示 \(x\) 对应到 \(y\),\(x\) 子树内的点对应集合 \(S\)。
将 \(S\) 优化掉,我们考虑做一个容斥,令 \(f(S)\) 表示只用 \(S\) 中的点的方案数,那么 \(ans = \sum(-1)^{n - |S|}f(S)\)。

浙公网安备 33010602011771号