QOJ 5089

发布时间 2023-09-25 10:43:43作者: Ender_32k

你细品巨大多太阳的题解,虽然看不懂,但是发现挺有道理的。

容易发现,一个无向图是可环覆盖图,当且仅当所有点的度数为偶数。所以将一条边 \((u,v)\) 看作集合 \(\{u,v\}\),相当于求选出 \(i\in [0,m]\) 个集合 \(\{u_i,v_i\}\),其对称差为 \(\varnothing\) 的方案数。

考虑集合幂级数,由于有 \(i\) 的限制需要带一个形式幂级数的元,即令 \(F(x,y)=\prod\limits_{i=1}^m(1+x^{\{u_i,v_i\}}y)\),那么 \(\text{ans}_i=[x^{\varnothing}y^i]F(x,y)\)\(x\) 的乘法定义为对称差(异或)卷积,而 \(y\) 的乘法定义为加法卷积。

\(x^S\) 的系数当做关于 \(y\) 的形式幂级数,将 \(F(x,y)\) 简写为 \(F\),则我们只需要求出 \([x^{\varnothing}]F\),考虑 \([x^{\varnothing}]F=\frac{1}{2^{n}}\cdot \sum\limits_{S}[x^S]\text{FWT}(F)\)

\[[x^{S}]\text{FWT}(F)=\prod\limits_{i=1}^m[x^S]\text{FWT}(1+x^{\{u_i,v_i\}}y) \]

注意到 \(\text{FWT}\) 算子的定义 \([x^S]\text{FWT}(F)=\sum\limits_{T}(-1)^{|S\cap T|}[x^T]F\)。由于 \(T=\varnothing\)\((-1)^{|S\cap T|}=1\),所以 \([x^{S}]\text{FWT}(1+x^{\{u_i,v_i\}}y)=1+y/1-y\)

于是 \([x^S]\text{FWT}(F)\) 一定能写成 \((1+y)^{m-a_S}(1-y)^{a_S}\) 的形式。考虑到 \(a_{S}\) 的意义为 \(|\{u_i,v_i\}\cap S|=1\)\(i\) 的个数,容易发现只有 \(O(m)\) 种,这启示我们对于每个 \(i\in [0,m]\) 计数 \(f_i\) 表示有多少个 \(S\)\(a_{S}=i\),答案就是 \(\sum\limits_{i=0}^m(1+y)^{m-i}(1-y)^if_i\)

考虑如何求出 \(f_i\)。枚举点 \(u\),每次选择在 \(S\) 中加入/不加入点 \(u\),并动态维护此时的 \(a_S\)。那么 \(a_S\) 增加所有 \(u\in S\)\(v\neq S\) 的边的个数即可。

复杂度 \(O(2^n+\text{poly}(m))\)