[清华集训2017]生成树计数

这篇博客介绍了如何利用PRUFER序列和指数生成函数(EGF)解决图论中的生成树计数问题。通过递推公式和数学转化,将复杂度降低到可以接受的范围,最终利用分治和快速傅里叶变换(NTT)进行高效计算,实现了( mathcal{O}(nlog^2n) )的时间复杂度解决方案。
摘要由CSDN通过智能技术生成

在一个\(s\)个点的图中,存在\(s-n\)条边,使图中形成了\(n\)个连通块,第\(i\)个连通块中有\(a_i\)个点。

现在我们需要再连接\(n-1\)条边,使该图变成一棵树。对一种连边方案,设原图中第\(i\)个连通块连出了\(d_i\)条边,那么这棵树\(T\)的价值为:

\[\mathrm{val}(T) = \left(\prod_{i=1}^{n} {d_i}^m\right)\left(\sum_{i=1}^{n} {d_i}^m\right) \]

你的任务是求出所有可能的生成树的价值之和,对\(998244353\)取模。


(可能只有我没读出来题目说连通块内的连边方式不计。)

树和每个点的度数可以联想到\(prufer\)序列。那么设\(c_i\)为第\(i\)个点在\(prufer\)序列中出现的次数,则\(c_i=d_i-1\)。考虑对于一个确定的序列\(c_i\),它对答案的贡献就是

\[\frac{(n-2)!}{\prod_{i=1}^nc_i!}\times (\prod_{i=1}^na_i^{c_i+1})\times (\prod_{i=1}^n(c_i+1)^m)\times (\sum_{i=1}^n(c_i+1)^m) \]

第一项是这个序列对应的有标号无根树个树;第二个是因为每个连通块中的点可以任意分配这个连通块的出边;后面两个是题面定义的价值。

那么有一个暴力思路就是递推,在那之前我们把\((n-2)!\prod_{i=1}^na_i\)看作常数项,只考虑剩余的式子。设

\[f_{n,m}=\sum_{\sum_{c_i}=m}\frac{(\prod_{i=1}^na_i^{c_i})\times (\prod_{i=1}^n(c_i+1)^m)}{\prod_{i=1}^nc_i!}\\ g_{n,m}=\sum_{\sum_{c_i}=m}\frac{(\prod_{i=1}^na_i^{c_i})\times (\prod_{i=1}^n(c_i+1)^m)}{\prod_{i=1}^nc_i!}\times (\sum_{i=1}^n(c_i+1)^m) \]

即递推前\(n\)个点的总\(c_i\)\(m\)的所有情况之和。转移就有:

\[f_{n,m}=\sum_{i=0}^mf_{n-1,m-i}\times \frac{a_i^i\times (i+1)^m}{i!}\\ g_{n,m}=\sum_{i=0}^m(g_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值