文中大写字母均表示树的边集。
(op = 0)
答案就是 (y^{n - |T1cap T2|}),随便开个什么东西统计一下就好了。
(op = 1)
要求:
[sum_{T2} y^{n - |T1cap T2|}
]
考虑容斥。注意到有 (f_{S} = sum_{Tsubseteq S}sum_{Rsubseteq T}left(-1
ight)^{|T| - |R|}f_{R})(此处,(f_S = y^{n - |S|})),代入得:
[egin {align*}
& sum_{T2} sum_{Ssubseteq T1cap T2}sum_{Tsubseteq S}left(-1
ight)^{|S| - |T|}y^{n - |T|} \
= & sum_{Ssubseteq T1}g_Ssum_{Tsubseteq S}left(-1
ight)^{|S| - |T|}y^{n - |T|} \
= & sum_{Ssubseteq T1} g_S y^{n - |S|} sum_{k = 0}^{|S|} inom{|S|}{k}left(-y
ight)^{|S| - |T|} \
= & sum_{Ssubseteq T1} g_S y^{n - |S|} left(1 - y
ight)^{|S|} \
end {align*}
]
其中 (g_{S}) 表示包含边集 (S) 的树的数量。
设 (S) 形成了 (k) 个连通块,它们的大小序列为 ({a_i}),易知 (k = n - |S|)。关于这个 (g_S) 有一个结论,就是 (g_S = n^{k - 2}prod a_{i})(证明在最后)。代入可得
[egin {align*}
& sum_{Ssubseteq T1} y^{k} left(1 - y
ight)^{n - k} n^{k - 2}prod a_{i} \
= & frac {left(1 - y
ight)^{n}} {n^{2}} sum_{Ssubseteq T1} prod frac {ny} {1 - y} a_{i} \
end {align*}
]
记 (k = frac {ny} {1 - y}),考虑它的组合意义,即从每个连通块中选出一个点给答案乘 (k) 的贡献。
考虑 dp,记 (dp_{u, 0/1}) 表示考虑 (u) 这棵子树,(u) 所在连通块是否造成贡献,所有已确定的连通块的贡献的和。转移是显然的,注意转移时候的顺序。
(op = 2)
只有我感觉 (op = 2) 比 (op = 1) 简单吗
类似 (op = 1) 地推导,快进掉过程,可以得出关于答案的柿子:
[frac {left(1 - y
ight)^{n}} {n^{4}} sum_{T} prod frac {n^{2}y} {1 - y}a_{i}^{2}
]
枚举 (T) 似乎不太好处理,于是转而枚举连通块的大小序列 ({a_{i}})。对于一个大小为 (a_{i}) 的连通块,内部有 (a_{i}^{a_{i} - 2}) 种连边方案,那么对于一个连通块,它的生成函数可以表示为:
[sum frac {n^{2}yk^{k}} {1 - y}x^{k}
]
根据 exp 的组合意义,可以得到答案就是:
[frac {left(1 - y
ight)^{n}} {n^{4}}n![x^{n}]expleft( sum frac {n^{2}yk^{k}} {left(1 - y
ight)k!}x^{k}
ight)
]
注意特判 (y = 1)。
Code
Proof
求 (n) 个点,包含 (k) 个大小序列为 ({a_i}) 的连通块的生成树个数。
先把每个连通块看成一个点,考虑它的 ( ext{Prufer}) 序列。假设连通块 (i) 在序列中出现了 (d_{i}) 次,则答案为:
[left(prod a_i
ight)left(k - 2
ight)!sum_{sum d_{i} = k - 2}prod frac {a_{i}^{d_{i}}} {d_{i}!}
]
后面那个东西有一个 (sum d_{i} = k - 2) 的限制,不难想到使用生成函数来描述。具体地,答案为:
[left(prod a_i
ight)left(k - 2
ight)![x^{k - 2}] prod sumfrac {a_{i}^{k}} {k!}x^{k}
]
观察后面那个 (sumfrac {a_{i}^{k}} {k!}x^{k}),不就是 (e^{a_{i}x}) 吗。所以答案也就是:
[left(prod a_i
ight)left(k - 2
ight)![x^{k - 2}] e^{sum a_{i}x}
]
容易发现这和前面给出的结论是一致的。