qoj18373 Counting Trees

给定 \(2^k\) 个点的完全图,边 \((u,v)\) 带边权 \(w=u\oplus v\)

给定权值 \(a_*,b_*\)。 一个生成树 \(T\) 的权值为

\[\left(\sum_eb_w\right)^q\prod_ea_w \]

问,对于每个 \(d\),满足 \(d=\displaystyle\bigoplus_e w_e\) 的生成树边权之和。

\[k\le 16, q\le 5 \]


考虑枚举 \(r\),计数 $ \displaystyle\bigoplus_e w_e=r $ 的答案,记为 \(ans_r\)

令边带 \(ae^{zb}\) 的贡献,即可转化为边权之积,最后提取 \([z^q]\) 项系数即可。

考虑做 FWT,对 \(\widehat{ans}_r\) 求和,则边权为 \(d\) 的边额外贡献 \((-1)^{d\mathbin{\&} r}\) 的因子,记为 \(g_r(d)\),则边 \(d\) 贡献 \(f_r(d)=a_de^{zb_d}g_r(d)\)

构造该图的 Laplace 矩阵,有:

\[A_{uv}= \begin {cases} \displaystyle\sum_{t\neq u}f_r(u\oplus t) &\text{ if } u=v\\ -f_r(u\oplus v) &\text{ if } u\neq v \end{cases} \]

不妨令 \(f_r(0)=0\),则有 \(A_{uu}=F_r=\displaystyle\sum_t f_r(t)\)

应用矩阵树定理的特征值形式。

alt text

一个观察是,不妨取 \(h_s=[g_s(u)]^T\),则有。

\[\begin{align*} (Ah_s)_u=&\sum_v A_{uv}g_s(v) \\=&F_rg_s(u)-\sum_{v\neq u}f_r(u\oplus v)g_s(v) \\=&F_rg_s(u)-\sum_{v\neq u}f_{r\oplus s}(u\oplus v)g_s(u) \\=&g_s(u)(F_r-F_{r\oplus s}) \end{align*} \]

于是有 \((F_r-F_{r\oplus s})\) 为其一特征值,由于 \(s\) 任意性。有:

\[\widehat{ans}_r=|A|=\frac1{2^k}\prod_{t\neq r}(F_r-F_t) \]

\(F_r\) 不难 FWT 一次求得,其为关于 \(z\)\(q+1\) 次多项式。


关于 \(\displaystyle\prod_{t\neq r}(a_r-a_t)\) 一类问题,有一类解法是:

先求多项式 \(P(x)=\displaystyle\prod_t(x-a_t)\),取其导数

\[\frac\partial{\partial x}P(x)=\sum_i\prod_{j\neq i} (x-a_j) \]

\(\frac{\partial P}{\partial x}(a_r)\)中,\(i\neq r\)\(\prod\) 均贡献 \(0\),其值即为所求。

那么利用多项式多点求值即可在 \(\mathcal O(n\log^2 n)\) 时间内求出答案。


回到原问题,想要套用上面那个方法,在多点求值的过程中需要处理 \(\left(\mathbb{F}_p[z]/(z^{q+1})\right)[x]\) 域上二维多项式的求逆等操作,比较麻烦。

可以先同样分治 NTT 求出 \(P\),然后取 \(p_i=[z^i]P\),注意这里 \(p_i\) 是关于 \(x\)\(2^k\) 次多项式。

设系数 \(\alpha=[z^0]F_r\)\(\beta=F_r-\alpha\),取 \(\frac\partial{\partial x}P\)\(\alpha\) 处的泰勒展开:

\[\begin{align*} [z^q]\frac{\partial P}{\partial x}(F_r) &=[z^q]\sum_{k=0}^\infty\frac{\frac{\partial^{k+1}P}{\partial x^{k+1}}(\alpha)}{k!}(F_r-\alpha)^k \\&=[z^q]\sum_{k=0}^\infty\frac1{k!}\frac{\partial^{k+1}P}{\partial x^{k+1}}(\alpha)\beta^k \\&=\sum_{k=0}^q\frac1{k!}\sum_{j=0}^qp_j^{(k+1)}(\alpha)[z^{q-j}]\beta^k \end{align*} \]

即可转化为关于 \(x\) 的单维多项式多点求值问题。

时间复杂度 \(\mathcal O(q^2k^22^k)\)


代码太丑了不放了(?)10.1k

posted @ 2026-08-24 04:42  CuteNess  阅读(5)  评论(0)    收藏  举报