ABC253H(集合幂级数,矩阵树定理)

首先可以将 \(k\gets \min(n-1,k)\),因为 \(n-1\) 次操作后的操作都是无效的。

考虑对森林个数计数然后除以 \(m^k\)

\(f_{i,S}\) 表示点集为 \(S\),边集大小为 \(i\) 的森林个数,这里不考虑加边的顺序,因此 \(k\) 次操作后森林的个数为 \(f_{k,\{1,\ldots ,n\}}k!\)

考虑转移,设 \(g_{S}\) 表示点集 \(S\) 的生成树个数,每次枚举一颗树 \(T\subset S\)\(f_{i,S}\gets g_{T}f_{i-|T|+1,S\backslash T}\)

\(g\) 是好求的,枚举集合后矩阵树定理即可,这部分复杂度为 \(O(n^32^n)\)

\(f\) 的转移其实就是个多一维限制的子集卷积的形式,换一种形式即为:

\[f_{i,U}=\sum_{S \cup T=U,S\cap T=\varnothing,j+|T|=i-1}f_{j,S}g_{T,|T|} \]

定义这种运算为作用于集合幂级数上的单位乘法,将 \(f_i\)\(g\) 视为集合幂级数,那么就可得 \(f_i=g^i\)

zszz,fmt 是线性变换,类似连通子图计数的方法,定义 \(g_i\)\(\sum_{S}[|S|=i]g_Sx^S\),于是就可以可以在一开始用一次集合或的 fmt 得到 \(\hat{g_i}\),然后过程中暴力枚举进行普通卷积(这里不是复杂度瓶颈),最后进行一次 ifmt 得到答案,这部分的复杂度也是 \(O(n^32^n)\)

总的复杂度就是 \(O(n^32^n)\)

(Official Editorial 的 \(O(n^32^n+n3^n)\) 太逊啦!)

posted @ 2022-05-28 22:50  Legitimity  阅读(220)  评论(0编辑  收藏  举报