#P16905. [CCO 2026] Tree Traversals

[CCO 2026] Tree Traversals

题目描述

Yevin Kang 有一棵包含 NN 个顶点的树,顶点用 11NN 的整数标号。树是一张无向连通图,且不包含环。

KK 为一个正整数。我们如下定义 f(K)f(K)

对于任意两个顶点 1u,vN1 \le u, v \le N,令 d(u,v)d(u, v) 表示连接顶点 uu 和顶点 vv 的简单路径上的边数。特别地,对所有 1uN1 \le u \le Nd(u,u)=0d(u, u) = 0

一个 1,,N1, \ldots, N 的排列 p1,,pNp_1, \ldots, p_N 被称为 好的,如果满足以下所有条件。

  • 对所有 i=2,,Ni = 2, \ldots, N,有 d(pi1,pi)Kd(p_{i-1}, p_i) \le K
  • 对所有满足 1i<jN1 \le i < j \le N 的整数对 (i,j)(i, j),有 d(1,pi)d(1,pj)d(1, p_i) \le d(1, p_j)

那么,f(K)f(K) 就是好的排列的个数。

Yevin 认为这个问题太简单了,于是他给出了 QQ 个正整数 K1,,KQK_1, \ldots, K_Q。他要求你输出 f(K1),f(K2),,f(KQ)f(K_1), f(K_2), \ldots, f(K_Q)109+710^9 + 7 取模的值。

这里可能还需要说明,“mod” 对应于大多数编程语言中的 %\% 运算符,表示除法取余。例如,5mod3=25 \bmod 3 = 217mod4=117 \bmod 4 = 1

输入格式

每个测试包含多个测试用例。

输入的第一行包含一个整数 TT (1T5×1051 \le T \le 5 \times 10^5) —— 测试用例的数量。

每个测试用例的第一行包含两个空格分隔的整数 N,QN, Q (1QN5×1051 \le Q \le N \le 5 \times 10^5)。

接下来 N1N - 1 行每行包含两个空格分隔的整数 u,vu, v —— 表示树中有一条连接 uuvv 的边。保证这 N1N - 1 条边构成一棵树。

接下来一行包含 QQ 个整数 K1,,KQK_1, \ldots, K_Q —— 表示 QQ 个查询。

保证一个测试中所有测试用例的 NN 之和(记为 N\sum N)不超过 5×1055 \times 10^5

输出格式

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

2
3 3
1 2
1 3
1 2 3
6 3
1 2
1 3
3 4
3 5
3 6
1 2 3
0 2 2
0 6 12

提示

样例输入输出解释

样例中的两棵树如下图所示。

:::align{center} :::

在第一个测试用例中,对于 K=2K = 2K=3K = 3[1,2,3][1, 2, 3][1,3,2][1, 3, 2] 都是好的排列。[2,1,3][2, 1, 3] 对所有 KK 的值都不是好的排列,因为

d(1,p1)=10=d(1,p2)d(1, p_1) = 1 \nleq 0 = d(1, p_2)

违反了第二个条件。

可以证明,当 K=1K = 1 时不存在好的排列。

在第二个测试用例中,[1,3,2,4,5,6][1, 3, 2, 4, 5, 6] 对于 K=3K = 3 是一个好的排列,但对于 K=2K = 2 不是好的排列,因为 d(2,4)=32d(2, 4) = 3 \nleq 2

以下表格展示了可获得的 2525 分的分配情况:

分值 N\sum N 的限制 QQ 的限制 KiK_i 的限制
22 1N101 \le \sum N \le 10 1QN1 \le Q \le N 1KiN1 \le K_i \le N
33 1N5×1051 \le \sum N \le 5 \times 10^5 1Qmin(2,N)1 \le Q \le \min(2, N) 1Kimin(2,N)1 \le K_i \le \min(2, N)
55 1N30001 \le \sum N \le 3000 1Qmin(5,N)1 \le Q \le \min(5, N) 1KiN1 \le K_i \le N
77 1N5×1051 \le \sum N \le 5 \times 10^5 ^ ^
88 ^ 1QN1 \le Q \le N

翻译由 DeepSeek V4 Pro 完成