Solution Set - 组合计数

CF40E Number Table

Link&Submission.

显然 \(n,m\) 奇偶性不同时无解。奇偶性相同时,假设有一行全为空,剩下每行至少一个有空,则除这些位置外没有限制的位置都可以随便填,这些位置一定有唯一可行方案。又因为 \(k\lt \max(n,m)\),所以一定有一行或一列为空。假设是一行,如果有其它行全满,检查乘积是否为 \(-1\),不是则无解。是的情况可以直接忽略这一行。最后统计有多少可以自由选择的位置,假设 \(c\) 个,答案就是 \(2^c\)

CF140E New Year Garland

Link&Submission.

先考虑如果放 \(i\) 个球的一行恰好出现 \(j\) 种颜色的方案数。这里固定这 \(j\) 种颜色的集合。可以使用 DP,记答案为 \(f_{i,j}\),转移为

\[f_{i,j}=f_{i-1,j-1}\times j+f_{i-1,j}\times (j-1) \]

前一项乘 \(j\) 是选择 \(j-1\) 种颜色的集合,后一项乘 \(j-1\) 是保证相邻两个不相同。

再考虑总的方案数。定义 \(dp_{i,j}\) 为已经填好前 \(i\) 行,第 \(i\) 行恰好 \(j\) 种颜色的方案数。则

\[dp_{i,j}=dp_{i-1,j}\times(C_{m}^{j}-1)\times f_{l[i],j}+\sum_{k\neq j}dp_{i-1,k}\times C_{m}^j\times f_{l[i],j} \]

通过预处理一行的和可以做到 \(O(L=\sum_{i=1}^{n}l_i)\)。注意要开一个内存池存 \(dp\) 数组,而且这题模数不一定是质数,可以通过计算模数的各个质因数幂次预处理组合数。

CF482D Random Function and Tree

Link&Submission.

一眼树形 DP。定义 \(dp_{i,0/1}\) 表示以 \(i\) 为根的子树中染奇数/偶数个点的方案数,偶数的情况允许不染。分奇偶是因为染色跟奇偶性有关。转移 \(dp_u\) 时,定义一个辅助的 DP 数组 \(f_{i,0/1}\) 表示已经考虑了 \(u\)\(i\) 棵子树,染奇数/偶数个点的方案数。\(f\) 很好转移,最后 \(2f_{m,0}\rightarrow dp_{u,1},2f_{m,1}+1\rightarrow dp_{u,0}\)。当然有些情况是子树正序排列和倒序排列染色相同的。如果总数偶数,是若干棵子树选偶数个点;如果总数奇数,是奇数棵子树选奇数个点(剩下的子树不选)。前者直接乘法原理,后者再做 DP,\(f_{i,0}\) 表示前 \(i\) 棵子树中,奇数/偶数棵子树选奇数个点的方案数。很好转移。

CF325E The Red Button

Link&Submission.

为什么这里会有一道构造题啊

手玩容易发现奇数无解,证明很简单,因为每个点入度为 \(2\),而对 \(n=2m+1\),有边 \(0\rightarrow 0,m\rightarrow 2m,m\rightarrow 0,2m\rightarrow 2m\),这样 \(m\) 不管走向哪里都不行。

可以猜测偶数是有解的。记 \(n=2m\)。然后发现一个事情:\(i\)\(i+m\) 的两条出边的终点是相同的。那可以先随便分,分完之后构成若干个环。如果整个图不止一个环,一定有一个 \(i\)\(i\)\(i+m\) 不在一个环里。这个结论不太明显,但证明很容易:反证,如果不是,那么 \(i,i+m,2i,2i+1\) 都在一个环里,然后就可以从 \(0\) 开始依据二进制走到所有点。有这一条之后,用并查集维护每个点所属的环,扫描所有 \(i\),如果发现不同就交换,合并并查集。

CF896D Nephren Runs a Cinema

Link&Submission.

假设有 \(a\) 个 50,\(b\) 个 100,\(c\) 个 VIP,则最后留下 \(a-b\) 个 50。

熟知利用折线法可得:\(a\) 个 50,\(b\) 个 100,总能够找钱的方案数是 \(C_{a+b}^{a}-C_{a+b}^{a+1}\)。则上面 \(a,b,c\) 情况的方案数就是 \(C_{n}^{a+b}(C_{a+b}^{a}-C_{a+b}^{a+1})\)

固定 \(a+b=m\) 求和,有 \(lef=\lceil \frac{m+l}{2} \rceil \le a \le rig=\lfloor \frac{m+r}{2} \rfloor\),答案就是 \(\sum_{m}C_{n}^{m}(C_{m}^{lef}-C_{m}^{rig+1})\)\(O(n)\) 计算即可。

注意模数又不是质数,同样通过算质因子处理。

CF698F Coprime Permutation

Link&Submission.

观察一:相同质因数集合的数可以交换。
观察二:如果两个质数在 \([1,n]\) 中的倍数数目相同,可以交换这两个质数的所有倍数。

感觉这两个条件差不多了,那就差不多吧。也就是我们猜测这两个条件与题目条件充要。

根据题目中给出的一些位置,我们可以得到观察二中的交换关系。当然要判断这样交换是否合法。另外还要判断质因子集合的大小是否相同,毕竟这是一个不变量。对于观察二中的质数,显然会大于 \(\sqrt n\),所以只用考虑每个数的最大质因数。

判断合法后,我们可以知道对于某个质因数集合,有多少个数可以自由交换;同时我们也知道对于倍数数目相同的质数,有多少可以自由交换。把这些数的阶乘乘起来就是答案。

CF981H K Paths

Link&Submission.

按照被所有路径覆盖的边分类,它们当然也构成一条路径 \((u,v)\)。考虑所有路径在 \(u\) 一侧的端点。删掉 \(u\) 得到一些连通块,设不包含 \(v\) 的所有连通块大小为 \(c_1,c_2,\cdots,c_m\)。每个连通块内至多有一个路径端点,剩下如果有还没有分配的端点都只能是 \(u\)。路径有顺序,其实等价于两侧端点各自排列数的乘积。则 \(u\) 这一侧的排列数就是

\[\sum\limits_{I\subseteq \{1,2,\cdots m\}}\frac{k!}{(k-|I|)!}\prod\limits_{i\in I}c_i \]

把给出的树看成有根树,定义 \(f_u\) 表示 \(u\) 子树内上式的值(或者说对路径 \((u,fa_u)\)\(u\) 一侧的排列数),\(g_u\) 表示子树外(在 \(fa_u\) 一侧)。所有路径分成两类:祖先-后代链和其它。

对后者,总数是 \(\sum_{u,v}f_uf_v\)\(u,v\) 没有祖先后代关系。让每对 \((u,v)\) 在 LCA 处产生贡献。定义 \(s_u\)\(u\) 子树内所有点 \(f\) 值的和,则 \(u\) 处的贡献是 \(\sum\limits_{v\neq w\in Son(u)}s_vs_w=\frac{1}{2}((\sum\limits_{v\in Son(u)}s_v)^2-\sum\limits_{v\in Son(u)}s_v^2)\)

对前者,在链的祖先端点产生贡献,\(u\) 的贡献是 \(g_us_u\)

剩下的问题是如何来求 \(f,g\)。上面那个式子是不太好维护的,所以考虑直接求出 \(\sum\limits_{|I|=k}\prod\limits_{i\in I}c_i\)。显然它是多项式 \(f(x)=\prod\limits_{i=1}^m(x+c_i)\)\(x^{m-k}\) 次项的系数。来求 \(m\) 的展开式,用分治+NTT解决。一次求解的复杂度是 \(O(m\log^2 m)\),用这个方法求所有 \(f\) 的复杂度是 \(O(n\log^2 n)\)

\(g_v\) 相当于 \(f_{fa_v}\) 换了一个一次因式,那么可以 \(O(m)\) 暴力除掉原来的因式,再乘上新的因式。这样可能被菊花图卡到 \(O(n^2)\),所以再做优化:同样的因式只算一次。也是蛮经典的套路了,因为 \(\sum c_i\le n\),所以不同的 \(c_i\) 的个数是 \(O(\sqrt n)\) 级别的,那么单次时间复杂度降到 \(O(m\sqrt n)\)。求和是 \(O(n\sqrt n)\)

注意 \(k=1\) 需要特判。

CF750G New Year and Binary Tree Paths

Link&Submission.

感觉没有3200。

假设 \(a\)\(b\) 的路径和为 \(s\)\(a,b\) 的 LCA 为 \(x\)。固定 \(x\),设 \(x\) 的深度为 \(d\)\(1\) 的深度为 \(0\))。再固定 \(a,b\) 的深度 \(dl,dr\),放缩一下可以感觉到,如果 \(d,dl,dr\) 固定了,那么 \(x\) 至多一个。

事实上,做一下计算,固定 \(x,d,dl,dr\) 时,路径和最小值当然是 \(x\) 不断向左 \(dl-d\) 次(算上 \(x\) 经过 \(dl-d+1\) 个点),\(2x+1\) 不断向左 \(dr-d-1\) 次;最大值是 \(x\) 不断向右 \(dr-d\) 次,\(2x\) 不断向右 \(dl-d-1\) 次。可以算出此时路径和的取值范围是

\[[(2^{dl-d+1}+2^{dr-d+1}-3)x+(2^{dr-d}-1),(2^{dl-d+1}+2^{dr-d+1}-3)(x+1)-(2^{dl-d}-1)-(dl-d)-(dr-d)] \]

那么这个式子就证实了刚才的感觉。

枚举 \(d,dl,dr\),计算 \(x\),假设 \(s\) 离上面的左端点还有 \(t\)。我们把路径的两个端点在相应的层右移。找规律会发现,从一个点开始不断右移,它到根的距离增加量是这样一个数列:\(1,2,1,3,1,2,1,4,1,2,1,3,1,2,1,5,\cdots\)。第 \(i\) 项是 \(v_2(i)+1\)。对它求和得到,如果 \(u\)\(x\) 子树内这一层的第 \(n+1\) 个点,则 \(u\)\(x\) 的路径的总和比这棵子树内第一个点增加了 \(v_2(n!)+n=2n-S_2(n)\)。这里 \(v_2(n),s_2(n)\) 分别表示 \(i\)\(2\) 的幂次,\(i\) 在二进制下 \(1\) 的个数。

所以我们只要解一个方程:\(2n-S_2(n)+2m-S_2(m)=t\)\(n,m\) 就代表了左右端点分别是第几个,范围限制是 \(n\lt 2^{dl-d-1},m\lt 2^{dr-d-1}\)

会发现 \(S_2(n),S_2(m)\le \log_2 10^{15}\lt V=50\),所以考虑枚举 \(S_2(n)+S_2(m)=q\),可以算出 \(n+m=p\)。对于这个问题 DP 解决,\(dp_{i,j,0/1}\) 表示已经填好了 \(n,m\) 的最低 \(i\) 位,其中填了 \(j\)\(1\),下一位有没有进位。递推是容易的。

时间复杂度的一个上界是 \(O(V^6)\),但根本跑不满,最后跑的飞快。

posted @ 2023-09-06 11:57  by_chance  阅读(21)  评论(0编辑  收藏  举报