P16135 [ICPC 2018 NAIPC] Red Black Tree

题目描述

给定一棵有根树,包含 $n$ 个节点,节点编号为 $1 \dots n$。根节点为 1。其中 $m$ 个节点被染成红色,其余节点为黑色。 你需要选择一个节点子集,使得子集中不存在某个节点是另一个节点的祖先。例如,如果 A 是 B 的父节点,B 是 C 的父节点,那么 A、B、C 中最多只能有一个被选入子集。此外,你希望所选子集中恰好包含 $k$ 个红色节点。 已知恰好有 $m$ 个红色节点,请对于 $k = 0 \dots m$ 的每个取值,计算出满足上述条件且恰好包含 $k$ 个红色节点的子集数量。

输入格式

每个输入包含单个测试用例。请注意,你的程序可能会在不同输入上多次运行。每个测试用例的第一行包含两个整数 $n$($1 \leq n \leq 2 \times 10^5$)和 $m$($0 \leq m \leq \min(10^3, n)$),其中 $n$ 是树中的节点数,$m$ 是红色节点的数量。节点编号为 $1 \ldots n$。 接下来的 $n - 1$ 行,每行包含一个整数 $p$($1 \leq p \leq n$),表示该节点的父节点编号。节点按顺序给出,从节点 2 开始,然后是节点 3,依此类推。节点 1 是根节点,因此被跳过。保证这些节点构成一棵以节点 1 为根的无环树。 接下来的 $m$ 行,每行包含一个整数 $r$($1 \leq r \leq n$)。这些是红色节点的编号。所有 $r$ 的值互不相同。

输出格式

输出 $m + 1$ 行,分别对应 $k = 0 \dots m$ 时满足条件的子集数量。按顺序输出这些数字,并对 $10^9 + 7$ 取模。

说明/提示

翻译由 DeepSeek V3.2 完成