洛谷 P6624

洛谷 P6624

给定一张 \(n\) 个点 \(m\) 条边的无向图,边带边权 \(w_i\)。对于一棵生成树 \(T\),其权值为:

\[val(T) = (\sum\limits_{e \in T} w_e) \cdot \gcd \limits_{e \in T} w_e \]

求所有生成树权值之和对 \(998244353\) 取模的结果。

\(n \le 30, w \le 152501(V = 152501)\)

首先用莫比乌斯反演处理掉 \(\gcd\)(利用 \(Id = \varphi * I\)):

\[\begin{aligned} val(T) &= (\sum\limits_{e \in T} w_e) \cdot \sum\limits_{d | \gcd\{w_e\}} \varphi(d) \\ &= \sum\limits_{d} \varphi(d) \sum\limits_{T | \forall e \in T, d | w_e} \sum\limits_{e \in T} w_e \end{aligned} \]

枚举 \(d\) 后,把 \(d | w_e\) 的边提取出来,形成了一张新的图 \(G\)。问题转化为求 \(G\) 所有生成树的权值和。

如果 \(val(T)\) 中的求和部分改为 \(1 / \prod\limits_{e \in T} w_e\),就是一个矩阵树定理的板子题。

对于加法,解决方式是我们构造一个多项式:\((1 + wx)\),那么答案就是 \([x^1]\)

对于多项式的运算,加减直接算即可,简单说一下乘、除(省略高于 \(x\) 的项):

\((a + bx)(c + dx) = ac + (ad + bc)x\)

\(\dfrac{a + bx}{c + dx} = \dfrac{a}{c} + (\dfrac{b}{c} - \dfrac{ad}{c^2})x\)

除法解释一下,我们对于多项式 \(c + dx\) 求逆,待定系数: \((C + Dx)(c + dx) \equiv 1 \pmod {x^2}\)(不用管二次项),得到:

\[\begin{cases} C \cdot c &= 1 \\ Cd + Dc &= 0 \end{cases} \]

记得:\(C = \frac{1}{c}, D = -\frac{d}{c^2}\),带到上面即可。

所以高斯消元的的时候,要满足 \(A_{i, i}\) 的常数项不为 \(0\),才能求逆元。如果都是 \(0\),行列式的值也未必是 \(0\),要特判一下,对于一次项做普通的消元即可。(洛谷不卡,偷懒没写。)

重载运算符即可直接暴力求行列式了。

时间复杂度:\(O(n^3V)\),可能可以通过。

有一个巨大的优化是,如果 \(d | w_e\)\(e\) 的数量不足 \(n - 1\),就没有生成树,不用做了。这样只有至多 \(O(\frac{\sum\sigma(w)}{n - 1})\)\(d\) 了,而且跑不满,足以通过。(\(w_e\) 最多 \(144\) 个约数)

时间复杂度:\(O(n^2\sum \sigma w)\)

这个题似乎是两个割裂的部分拼起来的。

posted @ 2026-01-11 09:48  xiehanrui0817  阅读(10)  评论(0)    收藏  举报