数学做题记录——组合篇
P4921 [MtOI2018] 情侣?给我烧了!
设 \(F(S)\) 为钦定集合 \(S\) 中的情侣对恰好坐在一起的方案数,设 \(|S| = k\),则
设 \(G(S)\) 为恰好集合 \(S\) 中的情侣对恰好坐在一起的方案数,则
令 \(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)!\),对上式两边求和,得
于是
考虑将 \(k\) 分离出来,我们有 \(\binom{p}{k} \binom{n}{p} = \binom{n}{k} \binom{n - k}{p - k}\),则
用 \(t = p - k\) 换元,有
记 \(\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\),则
令 \(h(n) = \sum_{t=0}^{n}(-1)^{-t} 2^{-t} \binom{n}{t} \frac{(2t)!}{t!}\),有组合数,考虑递推
于是再令 \(\alpha(n) = \sum_{t=0}^{n} (-1)^{-t} 2^{-t} \binom{n}{t} \frac{(2t)!}{t!} \times t\)
到这一步之后就和上面 \(h(n)\) 化简中的第二项一样了,所以
回归主题,
\(O(n)\) 预处理 \(h(n)\) 和 \(\alpha(n)\) 即可 \(O(1)\) 回答,复杂度 \(O(n+T)\)
P4260 [Code+#3] 博弈论与概率统计
第 \(5\) 道黑
关于条件概率:
所以单次胜率 \(p\) 直接就被消掉了,这题主要求的就是 Alice 得 \(k\) 分的方案数
首先想起来一个 CF 题,CF1845D Rating System
于是根据这个题,我们发现 Alice 的得分过程是这样的:
- 得分从 \(0\) 开始增加,有若干次回到 \(0\)
- 得分从 \(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\) 的方案数就可以表示为:
后面一堆显然不可以直接计算,我们考虑组合意义,
在序列上,乘上 \(\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}\)
有了这个式子,我们只需要代入原式,化简整理,就可以得到要求的式子:
是一个下指标求和,没有可用的公式......
但是还是有做法的,下指标求和可以通过莫队解决,对于这个题,我们定义
当 \(n \le m\) 时,\(f(n, m)\) 就是我们要求的答案的第二项,这样就有了一个类似区间的东西
裂项,有 \(f(n, m) = f(n - 1, m) + f(n, m - 1)\)
则
同理可得 \(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\),有
同理,
这样就可以进行莫队的转移了
复杂度为 \(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)!}\)
最终答案就是:
注意这里由于题目需要高精度,我们将前面的阶乘都提出来,后面剩下一个可用单变量存下的值,方便计算
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}\)
所以答案就是
\(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^\prime_n = n!f_n\),那么在递推式两边同乘 \(n!\),得到
最后再对 \(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 容斥,得到
发现分母 \(\sum_{p \in T} p\) 很难拆开,但值域不大,考虑背包,式子变为
后面的求和可以用背包做,考虑组合数的组合意义:从 \(T\) 中选出 \(n - k\) 个关键点的方案数,可以加到 dp 里做,符号也类似,由于 \(n - k \le 10\),复杂度为 \(O(mn(n-k))\),可以接受

浙公网安备 33010602011771号