「CF1111E」Tree

Description

Link:CF1111E

给出一棵包含 nn 个点的树。

QQ 次询问,每次询问给出三个整数 k,m,rk, m, r,随后给出 kk 个树上的节点 a1,a2,,aka_1, a_2, \cdots, a_k。假设树的根为 rr,我们需要将这 kk 个节点划分成至多 mm 组,并且:

  • 每个节点必须恰好属于一个组,每个组至少包含一个节点。
  • 在任意组内,不能存在两个不同的节点,使得其中一个点是另一个点的祖先。

你需要求出分组的方案数,答案对 109+710^9 + 7 取模。

数据范围:1n,Q1051 \leq n, Q \leq 10^51k,rn1 \leq k, r \leq n1mmin(300,k)1 \leq m \leq \min(300, k)1k1051 \leq \sum k \leq 10^5

时空限制:1.51.5s / 256256MiB。

Solution

考虑计数。设 c1,c2,,ckc_1, c_2, \cdots, c_k 分别表示 a1,a2,,aka_1, a_2, \cdots, a_k 到根节点 rr 的路径上有多少个关键点。则将 kk 个关键点分进至多 mm 个有标号组的方案数为

f(m)=i=1k(mci)f(m) = \prod_{i = 1}^k (m - c_i)

但由于组与组之间不区分(无标号),设 g(m)g(m) 表示将 kk 个关键点分进恰好 mm 个有标号组的方案数,则答案应为 i=1ng(i)i!\sum_{i = 1}^n \frac{g(i)}{i!}

由二项式反演

f(i)=j=1i(ij)g(j)    g(i)=j=1i(1)ij(ij)f(j)f(i) = \sum\limits_{j = 1}^i \binom{i}{j} g(j) \iff g(i) = \sum\limits_{j = 1}^i (-1)^{i - j} \binom{i}{j} f(j)

故先求出 f(i)f(i),再通过二项式反演求出 g(i)g(i),最后计算 i=1ng(i)i!\sum_{i = 1}^n \frac{g(i)}{i!} 即可。

至于 cic_i 的处理,可以在 dfs 序上使用树状数组维护,并使用换根 Trick。

时间复杂度 O(klogn+km)\mathcal{O}(\sum k \log n + \sum km)