Combinatorics 第二弹

记录一些乱做的 count 题。

21. [ARC104F] Visibility Sequence

不要忘记一些重要的结构。

常建笛卡尔树的朋友都知道,按题目的意思跑一遍就可以建出笛卡尔树。

反之,有了笛卡尔树后求出唯一的 \(p\) 也是易如反掌。

只是需要微调一下,当值相同的时候,取位置靠后的作为树根,这样就对完了。

发现建出来的树的形态其实只和大小关系有关,于是值域可以缩减到 \(O(n)\),直接对 \(n\)\(\min\) 即可。

\(f_{l,r,x}\) 表示 \([l,r]\) 中最大值 \(\le x\) 的方案数。

转移时只需枚举最靠右的最大值位置即可。\(f_{l,r,x}=\sum f_{l,k,x}\times f_{k+1,r,x-1}\)

\(O(n^4)\)

22. [ARC104D] Multiset Mean

经典套路。

看到平均数,想到把所有数减去 \(\overline x\) 后总和为 \(0\)

然后只需要知道 \(f_{i,j}\) 表示 \([1,i]\) 拼出 \(j\) 的方案数,这可以用优化后的多重背包预处理。

然后就做完了。\(O(n^3k)\)

23. [ARC105F] Lights Out on Connected Graph

典典典。

连通二分图,首先考虑转为连通双色图,然后除以二就好。

连通双色图再转不一定连通的双色图,这个东西计数是简单的。

这种子图计数直接设出集合幂级数,连通二分图 \(F\),连通双色图 \(G\),不一定连通的双色图 \(H\)

根据符号化方法显然 \(H=\exp G\),于是 \(G=\ln H\),还有 \(F=\frac{1}{2}G=\frac{1}{2}\ln H\)

只需求出 \(H\),再取对数即可。考虑 DP,设\(h_S\) 表示 \(S\) 中的点可以构成多少个不一定连通的双色图,\(w_S\) 表示 \(S\) 的导出子图中有多少条边。

显然有 \(h_S=\sum\limits_{T\subseteq S}2^{w_S-w_T-w_{S\setminus T}}\)。这里把 \(2^{w_S}\) 提出来,后面是一个子集卷积,可以 \(O(n^22^n)\) 算。

集合幂级数 \(\ln\) 也可以 \(O(n^22^n)\) 算,于是复杂度为 \(O(n^22^n)\)

如果不用集合幂级数,也可以简单 DP,转移时钦定扣掉含有最小编号的点的连通块以防算重,复杂度 \(O(3^n)\)

24. [ARC106F] Figures

一眼顶针,鉴定为有标号无根树,考虑 prufer 序列。

考虑固定每个点用了多少度数,设为 \(r_i\)。用 prufer 序列可以算出这个度数序列对应着多少棵树,\(\dfrac{(n-2)!}{\prod\limits_{i=1}^n(r_i-1)!}\),于是可以列出式子开始化简。

\[\begin{aligned} & \sum\limits_{\sum\limits_{i=1}^n(r_i-1)=n-2}\dfrac{(n-2)!}{\prod\limits_{i=1}^n(r_i-1)!}\prod\limits_{i=1}^n\dbinom{d_i}{r_i}r_i!\\ &=(n-2)!\sum\limits_{\sum\limits_{i=1}^n(r_i-1)=n-2}\prod\limits_{i=1}^n\dbinom{d_i}{r_i}r_i\\ &=(n-2)!\sum\limits_{\sum\limits_{i=1}^n(r_i-1)=n-2}\prod\limits_{i=1}^n\dbinom{d_i-1}{r_i-1}d_i\\ &=(n-2)!\sum\limits_{\sum\limits_{i=1}^n(r_i-1)=n-2}\prod\limits_{i=1}^n[z^{r_i-1}](1+z)^{d_i-1}\prod\limits_{i=1}^n d_i\\ &=(n-2)![z^{n-2}](1+z)^{\sum\limits_{i=1}^n (d_i-1)}\prod\limits_{i=1}^n d_i\\ &=(\sum\limits_{i=1}^n (d_i-1))^{\underline{n-2}}\prod\limits_{i=1}^n d_i \end{aligned} \]

化到这里显然时间复杂度 \(O(n)\)。甚至可以 \(O(1)\) 空间。

25. [ARC107D] Number of Multisets

类似分拆数一样的东西,考虑类似分拆数一样去 DP。发现直接像分拆数一样每次扣出来一坨不太好,考虑另一种 DP 方式。

将这个过程搞成动态的,每次要么加入一个 \(1\),要么给当前有的所有数乘上 \(\dfrac{1}{2}\)。可以发现这个过程中集合中的数的和一直都是整数,因为没办法把一个分数凑回整数。

那么设状态 \(f_{i,j}\) 表示当前集合中有 \(i\) 个数,总和为 \(j\) 的方案数。转移就是加入一个 \(1\)\(f_{i+1,j+1}\gets f_{i,j}\),或者全局乘上 \(\dfrac{1}{2}\)\(f_{i,j}\gets f_{i,2j}\)。注意转移顺序。

\(O(n^2)\)

26. [ARC108D] AB

看到初始状态给定,实际变化的东西不多,考虑分讨。

\(c_{AB}=\texttt{A}\) 为例,另一种同理。

  • \(c_{AB}=\texttt{A}\)

    • \(c_{AA}=\texttt{A}\),那么显然只有 \(1\) 种。

    • \(c_{AA}=\texttt{B}\),那么继续分讨。

      • \(c_{BA}=\texttt{B}\),那么除了一开始的 \(\text{AAB}\) 之外,其余 \(n-3\) 位想是啥就是啥。于是有 \(2^{n-3}\) 种。

      • \(c_{BA}=\texttt{A}\),那么除了首尾两位,剩下的限制只有不能存在连续的 \(\texttt{B}\),这个容易简单 DP,或者大眼瞪出就是斐波那契数列 \(F_{n-2}\)

27. AT_mujin_pc_2018_f チーム分け

很厉害的计数 DP。

考虑一组中限制最严的位置就是 \(a\) 最小的人,尝试在这个位置计数。按 \(a\) 从大到小安排每个人,发现如果一个人没有加入和他的 \(a\) 一样大的小组,那么他的地位与 \(a-1\) 的人相同。

可以设 \(f_{i,j}\) 表示安排好了大小不小于 \(i\) 的小组,还剩下 \(j\) 个人没有安排的方案数,可以直接枚举安排了几个大小为 \(i\) 的小组进行转移。

可以发现这里有个调和级数一样的东西。复杂度是 \(O(n^2\log n)\)

28. P10813 【MX-S2-T4】 换

很牛的 Trick。

经典 trick:考虑值域为 \(\{0,1\}\) 时如何做?

发现其实是 01 串,所有合法的 01 串可以 \(O(m2^n)\) 预处理出来。

有结论:如果对于任意 \(k\in [1,V]\)\(a_i\gets [a_i\ge k]\) 后整个序列不降,那么 \(a_i\) 不降。这是容易证明的。

然后就可以考虑从大到小扫 \(k\),每次转移到的串都应当是当前串的超集。设 \(f_{i,S}\) 表示 \(k=i\),整个串的状态为 \(S\) 的方案数。转移就是子集和,可以做到 \(O(Vn2^n)\)

还能优化。发现整个串其实只有 \(O(n)\) 种数。所以把 \(V\) 优化到 \(n\),同时因为每次一定会新加入一些数,所以转移的时候要扣掉没有发生变化的。(其实就是设原来的状态为 \(T\),当前状态为 \(S\)\(T\ne S\))。统计答案时还要乘上组合数,给已有的若干种数分配到 \([1,V]\) 中。

并且因为不一定有 \(n\) 种数,所以及时统计答案。

posted @ 2025-07-27 21:53  RandomShuffle  阅读(15)  评论(0)    收藏  举报