数学做题记录——组合篇

P4921 [MtOI2018] 情侣?给我烧了!

\(F(S)\) 为钦定集合 \(S\) 中的情侣对恰好坐在一起的方案数,设 \(|S| = k\),则

\[F(S) = \frac{n!}{(n-k)!} 2^k (2n-2k)! \]

\(G(S)\) 为恰好集合 \(S\) 中的情侣对恰好坐在一起的方案数,则

\[F(S) = \sum_{S \subseteq T} G(T) \]

\[G(S) = \sum_{S \subseteq T} (-1)^{|T| - |S|}F(T) \]

\(g(k) = \sum_{|S| = k} G(S)\)\(f(k) = \sum_{|S| = k} F(S) = \binom{n}{k}\frac{n!}{(n-k)!} 2^k (2n-2k)!\),对上式两边求和,得

\[\sum_{|S| = k} G(S) = \sum_{|S| = k} \sum_{S \subseteq T} (-1)^{|T| - |S|}F(T) \]

于是

\[\begin{aligned} g(k) &= \sum_{|T| \ge k} \sum_{S \subseteq T \land |S| = k} (-1)^{|T| - k} F(T) \\ &=\sum_{|T| \ge k}(-1)^{|T| - k} \binom{|T|}{k} F(T) \\ &= \sum_{p = k}^n (-1)^{p - k} \binom{p}{k} f(p) \\ &= \sum_{p = k}^n (-1)^{p - k} \binom{p}{k} \binom{n}{p}\frac{n!}{(n-p)!} 2^p (2n-2k)! \end{aligned} \]

考虑将 \(k\) 分离出来,我们有 \(\binom{p}{k} \binom{n}{p} = \binom{n}{k} \binom{n - k}{p - k}\),则

\[\begin{aligned} g(k) &= \sum_{p=k}^n (-1)^{p-k} \binom{n}{k} \binom{n - k}{p - k} \frac{n!}{(n-p)!} 2^p (2n-2p)! \\ &= n! \binom{n}{k} 2^k \sum_{p=k}^n (-1)^{p-k} \binom{n - k}{p - k} \frac{1}{[(n-k)-(p-k)]!} 2^{p-k} [2(n-k) - 2(p-k)]! \end{aligned} \]

\(t = p - k\) 换元,有

\[\begin{aligned} g(k) &= n! \binom{n}{k} 2^k \sum_{t=0}^{n-k} (-1)^t \binom{n - k}{t} \frac{[2(n-k) - 2t]!}{(n - k - t)!} 2^t \end{aligned} \]

\(\phi(n) = \sum_{t=0}^{n} (-1)^t \binom{n}{t} \frac{(2n-2t)!}{(n - t)!} 2^t\),则 \(g(k) = n! \binom{n}{k} 2^k \phi(n - k)\)\(O(n^2)\) 预处理 \(\phi(n)\)\(O(n)\) 计算所有 \(g(k)\),即可做到 \(O(n^2 + Tn)\)

对于加强版,考虑如何快速计算 \(\phi(n)\),由于没有很好的组合公式,考虑递推

首先我们需要让 \(\phi(n)\) 看着更好看一点,注意到 \(\binom{n}{t} = \binom{n}{n - t}\),可以转为枚举 \(n - t\),则

\[\begin{aligned} \phi(n) &= \sum_{t=0}^{n} (-1)^t \binom{n}{t} \frac{(2n-2t)!}{(n - t)!} 2^t \\ &= \sum_{t=0}^{n}(-1)^{n-t} \binom{n}{t} \frac{(2t)!}{t!} 2^{n - t} \\ &= (-2)^n \sum_{t=0}^{n}(-1)^{-t} 2^{-t} \binom{n}{t} \frac{(2t)!}{t!} \end{aligned} \]

\(h(n) = \sum_{t=0}^{n}(-1)^{-t} 2^{-t} \binom{n}{t} \frac{(2t)!}{t!}\),有组合数,考虑递推

\[\begin{aligned} h(n) &= \sum_{t=0}^{n}(-1)^{-t} 2^{-t} (\binom{n-1}{t} + \binom{n-1}{t-1}) \frac{(2t)!}{t!} \\ &=\sum_{t=0}^{n-1}(-1)^{-t} 2^{-t} \binom{n-1}{t} \frac{(2t)!}{t!} + \sum_{t=1}^{n}(-1)^{-t} 2^{-t} \binom{n - 1}{t - 1} \frac{(2t)!}{t!} \\ &= h(n - 1) + \sum_{t=0}^{n-1}(-1)^{-(t + 1)} 2^{-(t + 1)} \binom{n-1}{t} \frac{(2t)!}{t!} \times 2 \times(2t+1) \\ &= h(n - 1) - \sum_{t=0}^{n-1}(-1)^{-t} 2^{-t} \binom{n-1}{t} \frac{(2t)!}{t!} \times(2t+1) &(将 2t+1 拆开)\\ &=-2\sum_{t=0}^{n-1} (-1)^{-t} 2^{-t} \binom{n-1}{t} \frac{(2t)!}{t!} \times t \end{aligned} \]

于是再令 \(\alpha(n) = \sum_{t=0}^{n} (-1)^{-t} 2^{-t} \binom{n}{t} \frac{(2t)!}{t!} \times t\)

\[\begin{aligned} \alpha(n) &= \sum_{t=0}^{n-1} (-1)^{-t} 2^{-t} \frac{n!}{t!(n-t)!} \frac{(2t)!}{t!} \times t \\ &= \sum_{t=0}^{n-1} (-1)^{-t} 2^{-t} \frac{n!}{(t - 1)!(n-t)!} \frac{(2t)!}{t!} \\ &= \sum_{t=0}^{n-1} (-1)^{-t} 2^{-t} n\binom{n-1}{t-1} \frac{(2t)!}{t!} \\ &= n\sum_{t=0}^{n-1} (-1)^{-t} 2^{-t} n\binom{n-1}{t-1} \frac{(2t)!}{t!} \end{aligned} \]

到这一步之后就和上面 \(h(n)\) 化简中的第二项一样了,所以

\[h(n) = -2\alpha(n-1) \\ \alpha(n) = -n(2\alpha(n-1) + h(n-1)) \]

回归主题,

\[\begin{aligned} g(k) &= n! \binom{n}{k} 2^k \phi(n - k) \\ &= n! \binom{n}{k} 2^k (-2)^{n-k} h(n-k) \\ &= (-1)^{n-k}n! \binom{n}{k} 2^n h(n-k) \end{aligned} \]

\(O(n)\) 预处理 \(h(n)\)\(\alpha(n)\) 即可 \(O(1)\) 回答,复杂度 \(O(n+T)\)

P4260 [Code+#3] 博弈论与概率统计

\(5\) 道黑

关于条件概率:

\[P(A|B) = \frac{P(AB)}{P(B)} \]

所以单次胜率 \(p\) 直接就被消掉了,这题主要求的就是 Alice 得 \(k\) 分的方案数

首先想起来一个 CF 题,CF1845D Rating System

于是根据这个题,我们发现 Alice 的得分过程是这样的:

  1. 得分从 \(0\) 开始增加,有若干次回到 \(0\)
  2. 得分从 \(0\) 开始增加,不再回到 \(0\)

那么过程 \(2\) 的最终得分就是整个游戏 Alice 的最终得分

我们可以把赢看成 \(1\),输看成 \(-1\),那么整个游戏的情况就可以用一个序列来表示

考虑刻画这个东西的结构,每次得分回到 \(0\) 时,后面连续的一段 \(-1\) 都会被忽视

同时根据套路,我们发现,如果没有 \(0\) 的限制,那么两人得分之和始终是 \(0\),所以可以看出,序列中被忽视的 \(-1\) 实际上也是得分的一部分,设被忽视的 \(-1\) 个数为 \(K\),那么 Alice 的得分就是 \(N - M + K\)

接着考虑序列的其他部分,在这些部分中,Alice 的得分从来没有到过 \(0\) 以下,所以我们可以把它看成一个括号序列

那么整个序列就可以看成是有 \(\alpha\) 个完整的括号序列,加上末尾一个残缺的括号序列,在每相邻两个序列之间,以及开头(注意没有结尾,一定是以一个残缺的括号序列结尾)散布着若干个未匹配的左括号

如果设 \(F(n, m, \alpha)\) 为从 \((0, 0)\) 走到 \((n, m)\) 期间不能越过 \(y=x\) 但是要经过该直线 \(\alpha\) 次(不算\((0, 0)\))的方案数,那么得分为 \(N - M + K\) 的方案数就可以表示为:

\[\sum_{K = max(M - N, 0)}^M (N - M + K) \sum_{\alpha=0} \binom{K + \alpha}{K} F(N, M - K, \alpha) \]

后面一堆显然不可以直接计算,我们考虑组合意义,

在序列上,乘上 \(\binom{K + \alpha}{K}\) 相当于在两个独立的括号序列之间填上一些左括号,使得序列中总共有 \(K\) 个未匹配的左括号
在坐标系当中,这相当于在路径与 \(y=x\) 的每个交点处再向上走几步,这些额外的步数总和是 \(K\)

于是,一个自然的想法是这等价于在每个交点处,将后面的路径向上提升若干个单位,并且提升后路径不越过 \(y=x+K\),从括号序列的角度来说,就是对于任意前缀,左括号数目减右括号数目 \(\le K\),即 \(\binom{n + m}{n} - \binom{n + m}{m - k}\)

于是乎,我打了表,发现这是错的,但是歪打正着,我们观察数据发现上面这个关于 \(K\) 的数列的差分就是答案!哦哦,原来上面那个是 \(\le K\),但是我们要求的是恰好有一个位置的括号数量差为 \(K\),所以差分一下就对了

也就是说,得分为 \(K\) 的序列个数是 \(\binom{n + m}{m - k} - \binom{n + m}{m - k - 1}\)

有了这个式子,我们只需要代入原式,化简整理,就可以得到要求的式子:

\[\max\{0, n - m\}\binom{n + m}{\min\{n, m\}} + \sum_{i=0}^{\min\{n, m\} - 1} \binom{n+m}{i} \]

是一个下指标求和,没有可用的公式......

但是还是有做法的,下指标求和可以通过莫队解决,对于这个题,我们定义

\[f(n, m) = \sum_{i=0}^{n - 1}\binom{n+m}{i} \]

\(n \le m\) 时,\(f(n, m)\) 就是我们要求的答案的第二项,这样就有了一个类似区间的东西

裂项,有 \(f(n, m) = f(n - 1, m) + f(n, m - 1)\)

\[\begin{aligned} f(n + 1, m) &= f(n, m) + f(n + 1,m - 1) \\ &= f(n, m) + \sum_{i=0}^{n} \binom{n + m}{i} \\ &= 2f(n, m) + \binom{n + m}{n} \end{aligned} \]

同理可得 \(f(n, m + 1) = 2f(n, m) - \binom{n + m}{n-1}\)

对于 \(f(n, m - 1)\)\(f(n - 1, m)\) 难以构造上指标依然为 \(n + m\) 的式子,我们考虑反解

\(f(n, m + 1) = 2f(n, m) - \binom{n + m}{n-1}\),将 \(m + 1\) 换为 \(m\),有

\[f(n, m - 1) = \frac{1}{2}(f(n, m) + \binom{n + m - 1}{n - 1}) \]

同理,

\[f(n - 1, m) = \frac{1}{2}(f(n, m) - \binom{n + m - 1}{n - 1}) \]

这样就可以进行莫队的转移了

复杂度为 \(O((N+M)\sqrt{N+M})\)

P2606 [ZJOI2010] 排列计数

取整看着不太友好,我们考虑把取整换元,条件变为:\(p_j > p_i\)\(j \in [2i, 2i+1]\),即 \(p_{2i} > p_i\)\(p_{2i+1} > p_i\),那很显然这就是小根堆所满足的条件,树形 dp 计算即可

\(t = \lfloor x / k \rfloor\),则 \(x \in [tk, (t + 1)k)\),可以用此换元,上取整同理

P3223 [HNOI2012] 排队

先考虑任意两名女生不相邻,将老师与男同学视为同类人,那么根据插板法,方案数是 \(\binom{n + 3}{m} (n+2)! m! = \frac{(n + 3)! (n + 2)!}{(n - m + 3)!}\) 再从中去掉两名老师在一起的方案数:\(2\binom{n + 2}{m} (n + 1)! m! = \frac{2(n + 2)! (n + 1)!}{(n - m + 2)!}\)

最终答案就是:

\[\frac{(n + 3)! (n + 2)!}{(n - m + 3)!} - \frac{2(n + 2)! (n + 1)!}{(n - m + 2)!} = (n + 2)^{\underline m}(n+1)! \times [(n+3)n - 2m] \]

注意这里由于题目需要高精度,我们将前面的阶乘都提出来,后面剩下一个可用单变量存下的值,方便计算

P5684 [CSP-J 2019 江西] 非回文串

同样的正难则反思想,用所有串的数量减去回文串的数量即可

P5505 [JSOI2011] 分特产

设每种特产的数量为 \(c_i\),第 \(i\) 个人分到第 \(j\) 种特产的数量为 \(x_{i, j}\)

那么原问题相当于 \(\sum_{i=1}^n x_{i, j} = c_j\),并且不存在 \(\sum_{j=0}^m x_{i, j} = 0\) 的非负整数解个数,考虑容斥

钦定 \(k\) 个人没分到任何特产,那么方案数为 \(\binom{n}{k} \prod_{j=1}^m \binom{c_j + n - k - 1}{c_j}\)

所以答案就是

\[\sum_{k=0}^n (-1)^k \binom{n}{k} \prod_{j=1}^m \binom{c_j + n - k - 1}{c_j} \]

\(O(nm)\) 计算即可

P3214 [HNOI2011] 卡农

好题

看到偶数,我们想到异或,我们把每个集合中所选数的情况用一个二进制数表示,那么问题就相当于选出 \(m\) 个不为 \(0\) 的互不相同的 \(N\) 位二进制数,满足它们的异或和为 \(0\)

这个东西很难直接计数,我们考虑递推,假设有一些不同的数构成一个集合 \(S\),如果它们的异或和不在 \(S\) 中,并且异或和不为 \(0\),那么把这个数加入 \(S\) 中,就可以得到一个异或和为 \(0\) 的集合。

\(f_n\) 为满足 \(\bigoplus_{x \in S} x = 0\) 的大小为 \(n\) 的合法集合个数,\(g_n\) 为满足 \(\bigoplus_{x \in S} x \notin S\) \(\bigoplus_{x \in S} x \neq 0\) 的大小为 \(n\) 的合法集合个数

那么因为对于一个异或和为 \(0\) 的集合,从中选出任意一个元素,它与剩下集合的异或和均为 \(0\),所以 \(f_n\) 所记的一个集合会被 \(g_{n-1}\)\(n\) 个集合各记一次,有 \(f_n = g_{n-1} / n\)

现在考虑 \(g_n\),“不属于”这一条件看着不好记数,正难则反,即用全集减去 \(\bigoplus_{x \in S} x \in S\) \(\bigoplus_{x \in S} x = 0\) 的集合个数,显然这两者没有交集,可以分开计数,后者显然是 \(f_n\)

对于前者,即 \(\exist a \in S, a = \bigoplus_{x \in S} x\),即 \(\exist a \in S, \bigoplus_{x\in S \setminus \{a\}} x = 0\),而 \(S \setminus \{a\}\) 是一个大小为 \(n-1\) 的集合,再搭配上一个元素 \(a\),数量就是 \(f_{n-1} (2^N - n)\)

考虑为什么这样不会算重,假设有两个集合 \(A, B\)\(f_{n-1}\) 计入,另外有两个数 \(a \notin A, b \notin B\),且 \(A \cup \{a\} = B \cup \{b\}\),因为 \(A, B\) 中元素异或和均为 \(0\) 要使 \(A\cup \{a\}\)\(B \cup \{b\}\) 相等,它们的异或和必定相等,必有 \(a = b\),从而必有 \(A = B\),故不会算重

因此,\(g_n = \binom{2^N-1}{n} - f_n - f_{n-1}(2^N - n)\)

从而,

\[f_n = \frac{1}{n} g_{n-1} = \frac{1}{n} [\binom{2^N-1}{n - 1} - f_{n - 1} - f_{n-2}(2^N - n + 1)] \]

计算即可

同时,有一个优化,我们可以将计算组合数变为计算下降幂,提升效率,具体的,我们转为记录二进制数之间有序的方案数,设为 \(f^\prime_n = n!f_n\),那么在递推式两边同乘 \(n!\),得到

\[f^\prime_n = (2^N - 1)^{\underline{n-1}} - f^\prime_{n-1} - (n-1) f^\prime_{n-2} (2^N - n + 1) \]

最后再对 \(f^\prime_m\) 除以 \(m!\) 即可

P3773 [CTSC2017] 吉夫特

首先,题意是说求不上升子序列满足每个 \(\binom{a_i}{a_{i+1}}\) 均为奇数的子序列个数

我们考虑什么时候一个组合数是奇数,模 \(2\) 意义下,我们考虑 Lucas 定理,即 \(\binom{n}{m}\) 等于对 \(n\)\(m\) 二进制中每一对应位分别求组合数再乘起来,所以只需考虑 \(\binom{0}{0}, \binom{0}{1}, \binom{1}{0}, \binom{1}{1}\) 四个数,其中只有 \(\binom{0}{1}\)\(0\),也就是说,\(\binom{n}{m} \mod 2 = 1 \Leftrightarrow m \subseteq n\)

然后枚举子集 \(O(3^{\log A})\) 即可

但是有一种更牛的做法,在上面的做法中,我们设 \(f(x)\) 为以数字 \(x\) 结尾的合法序列个数,其中 \(x\) 的位数是 \(18\),为了优化,我们也可以将前 \(9\) 位与后 \(9\) 位分开记录,记为 \(f^\prime(a, b) = f(a\times 2^9 + b)\)

这样,可以批量统计答案,记 \(g(a, b) = \sum_{b \subseteq x} f(a, x)\)

那么,我们在计算 \(f^\prime(a, b)\) 时,只需枚举 \(a \subseteq x\) 累加 \(g(x, b)\) 并枚举 \(x \subseteq b\) 更新 \(g(a, x)\)

这样,即使 \(a_i\) 不互不相同,我们也可做到 \(O(n \sqrt{2^{\log A}})\) 的复杂度

CF2161F SubMST

不知道为啥自己没做出这题

首先上来肯定先刻画 MST 的结构

我从树上路径并的角度去刻画,发现会有重复经过的边,需要在“关键点”(是集合中某点对的 LCA 且不在所选集合中)处选择最优边,难以维护

想对树上路径拆贡献,但是发现会有等价路径,不会处理,于是放弃

但是实际上这个是可以做的,如果遇到贡献等价,只能选其一时,我们可以规定一个优先级或者取代表元

我们考虑树上一条链的贡献,对于链 \((u, v)\),其长度为 \(d = dis(u, v)\),那么如果在选取点集的子图 \(G_S\) 上,其有贡献当且仅当不存在一条 \(u \rightsquigarrow v\) 路径使得其上每条边均 \(< d\),等价于不存在 \(t \in S\),满足 \(d > \max\{dis(t, u), dis(t, v)\}\)

证明

必要性是显然的

对于充分性,使用反证法,

考虑 \((u, v)\) 这条链,对于 \(S \setminus \{u, v\}\) 中一个点 \(t\),设其到 \((u, v)\) 的距离为 \(h\),“垂足” (\((u, v)\)\((u, t)\) 两条链交点)为 \(x\)\(dis(u, x) = a\)\(dis(x, v) = b\),则 \(a + b = d\)

假设对于所有 \(t \in S \setminus \{u, v\}\),均有 \(d \le \max\{dis(t, u), dis(t, v)\}\),那么链 \((u, v)\) 上的点(\(u, v\) 除外)均不在 \(S\) 中,简单分讨可知 \(h \ge \min\{a, b\}\),所以随 \(x\) 变化,\(h\) 的分布形如一个单峰序列,在链中点处最大,而由于我们必定有一条边跨越峰两侧,故这条边肯定长度大于 \(d\),与条件矛盾,得证

于是我们考虑枚举每一条链,考虑给链定一个优先级,端点编号小的链更优,而且我们发现满足条件的 \(t\) 必然不会比 \(u, v\) 深度都大,所以考虑枚举链端点深度更大的点,向深度小的点连边,而且有了深度保证,相当于自动保证了 \(\max\) 中的一个限制,只需人工保证另一个就行了

来自 Str_ywr 的做法,

答案相当于是 \(\sum_{d} (comp(d) - 1)\),其中 \(comp(d)\) 是连接所有边权 \(\le d\) 的边后,所选点集的连通块数量

所以我们只需要数连通块就行了,考虑给每个连通块规定一个代表元,这里我们选在原树上 \(bfs\) 序最小的点

然后我们发现,考虑到 \(comp(d)\) 时,点 \(u\) 是一个连通块中 \(bfn\) 最小的点 \(\Leftrightarrow\) \(u\)\(d\) 邻域内没有比它 \(bfn\) 更小的点

充分性显然,对于必要性,我们考虑反证法,假设 \(u\)\(d\) 邻域内没有比它 \(bfn\) 更小的点,但是在其连通块内有 \(bfs\) 更小的点 \(v\) ,我们将说明,必然存在一条连接 \(u, v\) 的路径,使得路径上的点 \(bfn\) 递减

假设一条路径 \(u \rightarrow s \rightarrow t\),满足 \(bfn_s > bfn_u\)\(bfn_s > bfn_t\),一定存在一条路径 \(u \rightarrow t\)

考虑 \(u, s, t\) 三点构成的虚树,设其根为 \(r\),那么考虑树的直径,由于 \(bfn_s\) 最大,其深度不小于 \(u, t\)\(s\) 必然是这棵虚树直径的一个端点,直径 \(d = \max(dis(u, s), dis(t, s))\),那么根据直径定义,\(dis(u, t) \le d = \max(dis(u, s), dis(t, s))\) 所以在完全图上,边 \((u, v)\) 此时必然已经被考虑

对一条 \(u \rightarrow t\) 的路径进行这般调整,即可得到一条 \(bfn\) 递减的路径,而由于 \(u\)\(d\) 邻域内(即相邻节点中)没有 \(bfn\) 更小的,故假设不成立,必要性得证

所以只需考虑所有 \(u, d\),当 \(u\)\(d\) 邻域内 \(bfn\)\(u\) 小的点均不在钦定的点集中,\(u\) 就有 \(1\) 的贡献,直接统计即可

P4707 重返现世

学习 Min-Max 容斥

Min-Max 容斥在概率期望中可以用来求某个时间集合全部发生的期望时间

此题中,我们设第一次收集到第 \(i\) 种原料的时间为 \(t_i\) 那么问题就是求 \(kth\min S\),即 \((n-k+1)th \max S\),直接上 Min-Max 容斥,得到

\[\begin{aligned} E((n-k+1)th \max S) &= \sum_{T\subseteq S} (-1)^{|T| - n + k - 1} \binom{|T| - 1}{n - k} E(\min T) \\ &= \sum_{T\subseteq S} (-1)^{|T| - n + k - 1} \binom{|T| - 1}{n - k} \frac{m}{\sum_{p\in T} p} \end{aligned} \]

发现分母 \(\sum_{p \in T} p\) 很难拆开,但值域不大,考虑背包,式子变为

\[\sum_{P=1}^m \frac{m}{P} \sum_{\mathrm{sum} (T) = p} (-1)^{|T|-n+k-1} \binom{|T| - 1}{n - k} \]

后面的求和可以用背包做,考虑组合数的组合意义:从 \(T\) 中选出 \(n - k\) 个关键点的方案数,可以加到 dp 里做,符号也类似,由于 \(n - k \le 10\),复杂度为 \(O(mn(n-k))\),可以接受

posted @ 2026-03-02 11:03  zhm0725  阅读(26)  评论(0)    收藏  举报