#SZSY1012. 树上排列计数

树上排列计数

题目描述

给定一棵有 NN 个顶点的无向树,顶点编号为 1,2,…,N1,2,\ldots,N。记 d(u,v)d(u,v) 为顶点 uu 与 vv 之间的简单路径包含的边数,特别地,d(u,u)=0d(u,u)=0。

对于正整数 KK,若 1,2,…,N1,2,\ldots,N 的排列 p1,p2,…,pNp_1,p_2,\ldots,p_N 同时满足以下条件,则称其为好排列:

  • 对所有 2≤i≤N2\le i\le N,有 d(pi−1,pi)≤Kd(p_{i-1},p_i)\le K。
  • 对所有 1≤i<j≤N1\le i<j\le N,有 d(1,pi)≤d(1,pj)d(1,p_i)\le d(1,p_j),即排列中顶点到顶点 11 的距离非递减。

记好排列的数量为 f(K)f(K)。给定 QQ 个正整数 K1,K2,…,KQK_1,K_2,\ldots,K_Q,依次求出 f(K1),f(K2),…,f(KQ)f(K_1),f(K_2),\ldots,f(K_Q) 对 109+710^9+7 取模的结果。

输入格式

第一行包含一个整数 TT,表示测试用例的数量。

对于每组测试用例:

  • 第一行包含两个整数 N,QN,Q。
  • 接下来 N−1N-1 行,每行包含两个整数 u,vu,v,表示树中连接顶点 uu 和 vv 的一条无向边。保证这些边构成一棵树。
  • 最后一行包含 QQ 个整数 K1,K2,…,KQK_1,K_2,\ldots,K_Q。

输出格式

对于每组测试用例输出一行,包含 QQ 个整数,依次为 f(K1),f(K2),…,f(KQ)f(K_1),f(K_2),\ldots,f(K_Q) 对 109+710^9+7 取模后的结果。

数据范围

对于所有输入:

  • 1≤T≤5×1051\le T\le5\times10^5。
  • 1≤Q≤N≤5×1051\le Q\le N\le5\times10^5。
  • 1≤u,v≤N1\le u,v\le N,1≤Ki≤N1\le K_i\le N。
  • 一个输入文件内,所有测试用例的 NN 之和不超过 5×1055\times10^5。

子任务

编号 分值 缩减范围
1 8 ∑N≤10\sum N\le10
2 12 Q≤min⁡(2,N)Q\le\min(2,N)
Ki≤min⁡(2,N)K_i\le\min(2,N)
3 20 ∑N≤3000\sum N\le3000
Q≤min⁡(5,N)Q\le\min(5,N)
4–5 60 —

样例 1

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

样例 1 说明

第一棵树中,深度非递减的排列只有 [1,2,3][1,2,3] 和 [1,3,2][1,3,2]。两者最后相邻的两个顶点距离均为 22,所以 K=1K=1 时均不合法,K=2,3K=2,3 时均合法。

第二棵树中,顶点 2,32,3 必须排在顶点 4,5,64,5,6 之前。K=2K=2 时,顶点 22 不能直接接到 4,5,64,5,6 中的任何一个,因此前面只能排成 [1,2,3][1,2,3],最后三个顶点有 66 种顺序。K=3K=3 时,2,32,3 的两种顺序都可使用,共有 1212 种好排列。