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)\) 的复杂度内解决。

浙公网安备 33010602011771号