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)\) 太逊啦!)