Solution Set - 组合计数

CF40E Number Table

Link&Submission.

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

CF140E New Year Garland

Link&Submission.

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

fi,j=fi1,j1×j+fi1,j×(j1)

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

再考虑总的方案数。定义 dpi,j 为已经填好前 i 行,第 i 行恰好 j 种颜色的方案数。则

dpi,j=dpi1,j×(Cmj1)×fl[i],j+kjdpi1,k×Cmj×fl[i],j

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

CF482D Random Function and Tree

Link&Submission.

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

CF325E The Red Button

Link&Submission.

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

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

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

CF896D Nephren Runs a Cinema

Link&Submission.

假设有 a 个 50,b 个 100,c 个 VIP,则最后留下 ab 个 50。

熟知利用折线法可得:a 个 50,b 个 100,总能够找钱的方案数是 Ca+baCa+ba+1。则上面 a,b,c 情况的方案数就是 Cna+b(Ca+baCa+ba+1)

固定 a+b=m 求和,有 lef=m+l2arig=m+r2,答案就是 mCnm(CmlefCmrig+1)O(n) 计算即可。

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

CF698F Coprime Permutation

Link&Submission.

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

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

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

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

CF981H K Paths

Link&Submission.

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

I{1,2,m}k!(k|I|)!iIci

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

对后者,总数是 u,vfufvu,v 没有祖先后代关系。让每对 (u,v) 在 LCA 处产生贡献。定义 suu 子树内所有点 f 值的和,则 u 处的贡献是 vwSon(u)svsw=12((vSon(u)sv)2vSon(u)sv2)

对前者,在链的祖先端点产生贡献,u 的贡献是 gusu

剩下的问题是如何来求 f,g。上面那个式子是不太好维护的,所以考虑直接求出 |I|=kiIci。显然它是多项式 f(x)=i=1m(x+ci)xmk 次项的系数。来求 m 的展开式,用分治+NTT解决。一次求解的复杂度是 O(mlog2m),用这个方法求所有 f 的复杂度是 O(nlog2n)

gv 相当于 ffav 换了一个一次因式,那么可以 O(m) 暴力除掉原来的因式,再乘上新的因式。这样可能被菊花图卡到 O(n2),所以再做优化:同样的因式只算一次。也是蛮经典的套路了,因为 cin,所以不同的 ci 的个数是 O(n) 级别的,那么单次时间复杂度降到 O(mn)。求和是 O(nn)

注意 k=1 需要特判。

CF750G New Year and Binary Tree Paths

Link&Submission.

感觉没有3200。

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

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

[(2dld+1+2drd+13)x+(2drd1),(2dld+1+2drd+13)(x+1)(2dld1)(dld)(drd)]

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

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

所以我们只要解一个方程:2nS2(n)+2mS2(m)=tn,m 就代表了左右端点分别是第几个,范围限制是 n<2dld1,m<2drd1

会发现 S2(n),S2(m)log21015<V=50,所以考虑枚举 S2(n)+S2(m)=q,可以算出 n+m=p。对于这个问题 DP 解决,dpi,j,0/1 表示已经填好了 n,m 的最低 i 位,其中填了 j1,下一位有没有进位。递推是容易的。

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

posted @   by_chance  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示