一道计数题 TopCoder14333 SRM697 ConnectedStates
代码还没写,不确定正确性
貌似是假了
题目是这样的:
给出序列 \(w_1,w_2,\cdots,w_n\),考虑一张 \(n\) 个点的图,\(i,j\) 之间有 \(w_i\times w_j\) 条连边。对于这张图的一棵生成树,其权值为 \(\prod d_i\)。你需要计算所有生成树的权值和 \(\bmod 10^9+7\) 的值。
原题数据范围:\(1\le n\le 2000\)。但可以做到 \(O(n\log n)\)。
首先我们考虑枚举每个点的度数,设为 \(d_1,d_2,\cdots,d_n\),那么贡献为 \(\prod d_iw_i^{d_i}\),由 \(\text{Prufer}\) 序列的经典结论可知方案数为 \(\frac{(n-2)!}{\prod (d_i-1)!}\)。
现在要求的就是
我们发现后面那一堆有点像多元二项式定理
但是这里 \(d_i\) 的范围是 \(\ge 1\),我们做代换 \(t_i=d_i-1\),上式即
我们发现有一个 \((n-2)!\prod w_i\) 是不变的,那么把这个东西提到前面去
我们发现如果没有最后那个 \(\prod (t_i+1)\) 那么前面那个就是 \((w_1+\cdots+w_n)^{n-2}\)
那么后面那一项怎么处理呢
我们考虑把这东西展开,得到
其中 \(U=\{1,2,\cdots,n\}\) 为全集。
交换求和顺序
接下来是非常神仙的一步,我们考虑做代换
那么上式化为
我们发现 \(\prod_{i\in S}(r_i+1)\) 和分母上的 \(\prod_{i\in S}(r_i+1)!\) 消掉了
再把 \(\prod_{i\in S}w_i^{r_i+1}\) 提个 \(\prod_{i\in S}w_i\) 出来,我们得到
我们发现可以把 \(\prod_{i\in S}w_i\) 提出来,然后终于可以用一步多元二项式定理了=_=
后面就是一些比较套路的东西了:枚举 \(|S|\),记 \(W=\sum_{i=1}^nw_i\) 那么上式即
其中 \(\prod_{i=1}^nw_i^{C_{n-1}^{d-1}}\) 的含义是,考虑每个 \(w_i\) 的贡献,那么满足 \(|S|=d\) 且 \(i\in S\) 的集合共有 \(C_{n-1}^{d-1}\),因此贡献就是 \(w_i^{C_{n-1}^{d-1}}\)。
可以发现后面那个就是 \(\left(\prod_{i=1}^nw_i\right)^{C_{n-1}^{d-1}}\),因此我们不仅要处理组合数对 \(10^{9}+7\) 取模后的值,还需要依据欧拉定理处理出来组合数对 \(10^9+6\) 取模的值来计算快速幂
看上去这个东西不是个质数,但实际上我们有 \(10^{9}+6=2\times (5\times 10^{8}+3)\),而 \(5\times 10^8+3\) 是一个质数。因此我们算出来组合数对 \(2\) 和 \(5\times 10^8+3\) 取模的值然后用中国剩余定理合并即可。
清算一下复杂度,可以发现至少能做到 \(O(n\log n)\)。