计数使我快乐(
设 T1,T2 表示两棵树,E1,E2 表示它们的边集,k(E) 表示 E 中的边构成的森林的连通块个数。
对于 op=0:
这个是 PJ T2 难度吧(
对于 op=1:
首先略过 y=1 的平凡情况。
考虑对 E1∩E2 应用子集反演:
∑E2yk(E1∩E2)=∑E2yn−|E1∩E2|=∑E2∑S⊆E1∩E2∑T⊆S(−1)|S|−|T|yn−|T|=∑S⊆E1(∑T⊆S(−1)|S|−|T|yn−|T|)∑S⊆E21=∑S⊆E1yn−|S|(∑T⊆S(−y)|S|−|T|)∑S⊆E21=∑S⊆E1yn−|S|(1−y)|S|∑S⊆E21
设 S 中的边构成 k=n−|S| 个连通块,其点数分别为 a1,a2,…,ak。
那么有结论 ∑S⊆E21=nk−2k∏i=1ai
证明可以参见 rqy 的博客或者 shadowice1984 的题解,这里不再赘述了。
(Prufer 序列好!)
于是 ∑S⊆E1yn−|S|(1−y)|S|∑S⊆E21=∑S⊆E1yk(1−y)n−knk−2k∏i=1ai=(1−y)nn2∑S⊆E1k∏i=1ny1−yai
设 c=ny1−y,考虑后一部分。
相当于在 T1 中划分出 k 个连通块,第 i 个连通块有 cai 的贡献。
这一问题有显然的 O(n2) 的树形 DP 解法。
而可以像 rqy 一样使用生成函数进行优化 DP 做到 O(n)。
但这里给出一个更为简单的做法。
考虑 cai 的组合意义,相当于在每个连通块中选一个点,每个点有 c 的贡献。
于是可以简单地设 fu,0/1 表示 u 所在的连通块是否选出了这个点的贡献和。
同样是 O(n) 的。
对于 op=2:
类比上一部分,此处略去推导过程,则需要计算 (1−y)nn4∑Sk∏i=1n2y1−ya2i
对于后一部分的和式,考虑枚举所有的 k 和 a1,a2,…,ak。
n∑k=1∑a1+a2+⋯+ak=nn!k!∏ki=1ai!k∏i=1n2y1−ya2i⋅aai−2i=n!n∑k=11k!∑a1+a2+⋯+ak=nk∏i=1n2y(1−y)ai!aaii
考虑构造生成函数来计算这个东西,设 F(x)=n2y1−y∞∑i=1iii!xi
则答案等于 (1−y)nn!n4[xn]n∑k=11k!Fk(x)
注意到这是一个 exp 的形式,所以答案就是 (1−y)nn!n4[xn]expF(x)
代码:
1 |
|