Description
Link:CF1111E
给出一棵包含 n 个点的树。
有 Q 次询问,每次询问给出三个整数 k,m,r,随后给出 k 个树上的节点 a1,a2,⋯,ak。假设树的根为 r,我们需要将这 k 个节点划分成至多 m 组,并且:
- 每个节点必须恰好属于一个组,每个组至少包含一个节点。
- 在任意组内,不能存在两个不同的节点,使得其中一个点是另一个点的祖先。
你需要求出分组的方案数,答案对 109+7 取模。
数据范围:1≤n,Q≤105,1≤k,r≤n,1≤m≤min(300,k),1≤∑k≤105。
时空限制:1.5s / 256MiB。
Solution
考虑计数。设 c1,c2,⋯,ck 分别表示 a1,a2,⋯,ak 到根节点 r 的路径上有多少个关键点。则将 k 个关键点分进至多 m 个有标号组的方案数为
f(m)=i=1∏k(m−ci)
但由于组与组之间不区分(无标号),设 g(m) 表示将 k 个关键点分进恰好 m 个有标号组的方案数,则答案应为 ∑i=1ni!g(i)。
由二项式反演
f(i)=j=1∑i(ji)g(j)⟺g(i)=j=1∑i(−1)i−j(ji)f(j)
故先求出 f(i),再通过二项式反演求出 g(i),最后计算 ∑i=1ni!g(i) 即可。
至于 ci 的处理,可以在 dfs 序上使用树状数组维护,并使用换根 Trick。
时间复杂度 O(∑klogn+∑km)。