组合计数
CF1874E Jellyfish and Hack
我会 \(O(n^6)\)!令 \(f_{n,i}\) 表示长度为 \(n\) 快排次数为 \(i\) 的排列数。转移:
考虑优化。不妨将转移写成多项式的形式,令 \(F_n=\sum\limits_{i=0}^{+\infty} f_{n,i}\cdot x^i\)。得到:
我们要求的就是 \(F_n\) 的各项系数,考虑系数转点值。注意到由于 \(\deg F=O(n^2)\),只需要知道 \(O(n^2)\) 个点值就可以拉插出 \(F_n\) 的系数。直接取 \(O(n^2)\) 个位置带进去求 \(F_n(x_0),F_n(x_1),\dots\),此时多项式退化成了点值,求一个 \(F_n(x_k)\) 的复杂度只有 \(O(n^2)\) 了,因此求这 \(O(n^2)\) 个点值的复杂度就是 \(O(n^4)\),拉插需要 \(O(n^4)\)。总时间复杂度 \(O(n^4)\),可以通过。
回顾一下拉插,设 \(n\) 次多项式 \(f(x)\) 过 \(n+1\) 个点 \((x_i,y_i)\),则有:
核心在于得到 \(l_i(x)=\prod\limits_{j\ne i} (x-x_j)\) 中 \(x\) 的各项系数。令 \(T=\prod_j (x-x_j)\),那么 \(l_i(x)=\frac{T}{x-x_i}\),可以用大除法(多项式除法)求出其各项系数。
P6846 [CEOI 2019] Amusement Park
DAG 子图计数。DAG 的性质就是可以不断剥离 \(\deg=0\) 的点将图删空。
令 \(f_S\) 表示点集为 \(S\) 的 DAG 子图数量。枚举零度点集 \(T\subseteq S\),要求 \(T\) 是独立集,转移:\(f_S=\sum\limits_{T\subseteq S} \mathrm{chk}(T)\cdot f_{S\setminus T}\)。发现算重了,原因是同一种定向方案中,零度点存在多种按层剥离方案。感觉上讲 \((-1)^{|T|+1}\) 就是容斥系数,严谨推导:设此时真正的极大零度点集为 \(P\),那么 \(P\) 可以被 \(T\subseteq P\) 统计到,需要配出系数 \(v\) 使得 \(\sum\limits_{T\subseteq P} v_{|T|}=1\),即 \(\sum\limits_{k=1}^{|S|}\binom{|S|}{i} v_i=1\),配 \(v_i=(-1)^{i+1}\) 二项式就可以了。
P10221 [省选联考 2024] 重塑时光
切了,其实没有黑吧(
首先我们发现切出空串很烦,那么直接钦定切出来的都不是空串,这样 \(i\) 个段排列的方案数就是 \(i!\),再把剩下的刀插进去,推一下系数是 \(\binom{k+1}{i}\)。那么问题转化成:将原图划分成若干大点,这些大点组成的图是 DAG,对方案的贡献是各个大点内部拓扑序数量的乘积。令 \(h_S,g_{S,i},f_{S,i}\) 分别表示 \(S\) 导出子图的拓扑序数量、划分成若干独立大点的方案数、原问题的方案数。\(h_S\) 可以直接枚举拓扑序第一个位置填什么。对于 \(g_{S,i}\) 就是每次剥离出来一个独立的集合 \(T\),套路的钦定 \(\mathrm{lowbit}(T)=\mathrm{lowbit}(S)\) 来保证剥离顺序的唯一性。\(f_{S,i}\) 就是一个 DAG 子图计数,转移:
直接转移是 \(O(3^nn^2)\) 的,但是通过了/hanx。
然后就是用刚刚那个 CF1874E 的 Trick 即可优化到 \(O(3^n n)\)。

浙公网安备 33010602011771号