P16905 [CCO 2026] Tree Traversals

题目描述

Yevin Kang 有一棵包含 $N$ 个顶点的树,顶点用 $1$ 到 $N$ 的整数标号。树是一张无向连通图,且不包含环。 令 $K$ 为一个正整数。我们如下定义 $f(K)$。 对于任意两个顶点 $1 \le u, v \le N$,令 $d(u, v)$ 表示连接顶点 $u$ 和顶点 $v$ 的简单路径上的边数。特别地,对所有 $1 \le u \le N$ 有 $d(u, u) = 0$。 一个 $1, \ldots, N$ 的排列 $p_1, \ldots, p_N$ 被称为 **好的**,如果满足以下所有条件。 - 对所有 $i = 2, \ldots, N$,有 $d(p_{i-1}, p_i) \le K$。 - 对所有满足 $1 \le i < j \le N$ 的整数对 $(i, j)$,有 $d(1, p_i) \le d(1, p_j)$。 那么,$f(K)$ 就是好的排列的个数。 Yevin 认为这个问题太简单了,于是他给出了 $Q$ 个正整数 $K_1, \ldots, K_Q$。他要求你输出 $f(K_1), f(K_2), \ldots, f(K_Q)$ 对 $10^9 + 7$ 取模的值。 这里可能还需要说明,“mod” 对应于大多数编程语言中的 $\%$ 运算符,表示除法取余。例如,$5 \bmod 3 = 2$ 且 $17 \bmod 4 = 1$。

输入格式

每个测试包含多个测试用例。 输入的第一行包含一个整数 $T$ ($1 \le T \le 5 \times 10^5$) —— 测试用例的数量。 每个测试用例的第一行包含两个空格分隔的整数 $N, Q$ ($1 \le Q \le N \le 5 \times 10^5$)。 接下来 $N - 1$ 行每行包含两个空格分隔的整数 $u, v$ —— 表示树中有一条连接 $u$ 和 $v$ 的边。保证这 $N - 1$ 条边构成一棵树。 接下来一行包含 $Q$ 个整数 $K_1, \ldots, K_Q$ —— 表示 $Q$ 个查询。 保证一个测试中所有测试用例的 $N$ 之和(记为 $\sum N$)不超过 $5 \times 10^5$。

输出格式

对于每个测试用例,输出一行包含 $Q$ 个空格分隔的整数 —— 即 $f(K_1), f(K_2), \ldots, f(K_Q)$ 对 $10^9 + 7$ 取模的值。

说明/提示

**样例输入输出解释** 样例中的两棵树如下图所示。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/h47fb49p.png) ::: 在第一个测试用例中,对于 $K = 2$ 或 $K = 3$,$[1, 2, 3]$ 和 $[1, 3, 2]$ 都是好的排列。$[2, 1, 3]$ 对所有 $K$ 的值都不是好的排列,因为 $$d(1, p_1) = 1 \nleq 0 = d(1, p_2)$$ 违反了第二个条件。 可以证明,当 $K = 1$ 时不存在好的排列。 在第二个测试用例中,$[1, 3, 2, 4, 5, 6]$ 对于 $K = 3$ 是一个好的排列,但对于 $K = 2$ 不是好的排列,因为 $d(2, 4) = 3 \nleq 2$。 以下表格展示了可获得的 $25$ 分的分配情况: | 分值 | $\sum N$ 的限制 | $Q$ 的限制 | $K_i$ 的限制 | |:-:|:-:|:-:|:-:| | $2$ 分 | $1 \le \sum N \le 10$ | $1 \le Q \le N$ | $1 \le K_i \le N$ | | $3$ 分 | $1 \le \sum N \le 5 \times 10^5$ | $1 \le Q \le \min(2, N)$ | $1 \le K_i \le \min(2, N)$ | | $5$ 分 | $1 \le \sum N \le 3000$ | $1 \le Q \le \min(5, N)$ | $1 \le K_i \le N$ | | $7$ 分 | $1 \le \sum N \le 5 \times 10^5$ | ^ | ^ | | $8$ 分 | ^ | $1 \le Q \le N$ | ^ | 翻译由 DeepSeek V4 Pro 完成