Fast as Fast as Ryser 题解

题意

给定一张 \(n\) 个点的完全图,边有边权,对于每个整数 \(k\in[0,\frac{n}{2}]\) 求出选出 \(k\) 条端点不交边的边权积之和,对 \(\color{red}2^{64}\) 取模。

\(n\le40\)

转化

不妨假设 \(2|n\) 且顶点编号为 \(0\sim n-1\)

第一步就是一个很神仙的转化,在 \((2k,2k+1)\) 之间连一条强制经过的边,则匹配变成了若干个链或环,且匹配的大小为 \(\dfrac{n}{2}\) 减去链的数量。

所以考虑设链的集合幂级数为 \(F\),环的集合幂级数为 \(G\),则所求即为 \([x^U]\left(\dfrac{F^k}{k!}\exp(G)\right)\)

注意 \(F\)\(G\) 的大小是 \(2^{\frac{n}{2}}\) 级别的。

求解 \(\boldsymbol{F}\)\(\boldsymbol{G}\)

求解 \(F\) 只需枚举路径的一端点后状压 dp 即可,求解 \(G\) 时,为避免重复计数只需枚举环上编号最大的点即可,时间复杂度为 \(\mathcal{O}\left(\sum\limits_{i=1}^{n}2^ii^2\right)=\mathcal{O}(2^{\frac{n}{2}}n^2)\)

转化 \(\boldsymbol{[x^U]\left(\dfrac{F^k}{k!}\exp(G)\right)}\)

使用转置原理。

假设有输入形式幂级数 \(b\),其中 \(b_i\)\(1\) 当且仅当 \(i\) 为全集 \(U\),那么这一过程构成了一个 \(b\) 到答案 \(a_k=\sum\limits_{i}b_i[x^i]\left(\dfrac{F^k}{k!}\exp(G)\right)\) 的线性变换。

所以只需解决如下转置问题后机械地写出其转置算法即可:

求解 \(b=\sum\limits_{i=0}^{n/2}a_i[x^i]\left(\dfrac{F^k}{k!}\exp(G)\right)\)

求解转置问题

用斯特林数类似的组合意义拆开 \(\dfrac{F^i}{i!}\)\(\exp G\) 后可以使用逐点牛顿迭代简单解决,在转移时,使用占位多项式的技巧做一次子集卷积即可。

至此,问题已在 \(\mathcal{O}(2^{\frac{n}{2}}n^2)\) 的复杂度内解决。

posted @ 2025-04-03 22:43  hhoppitree  阅读(258)  评论(0)    收藏  举报