#9866. 树上的括号序列

树上的括号序列

题目描述

Cuber QQ\text{Cuber QQ} 对无向树上的深度优先搜索很了解,他确信你也很熟悉。如果你不熟悉的话,Cuber QQ\text{Cuber QQ} 很高兴与你分享伪代码片段:

function dfs(int cur, int parent):
  print(`(`)
  for all nxt that cur is adjacent to:
    dfs(nxt, cur)
  print(`)`)

你可能注意到,Cuber QQ\text{Cuber QQ} 在进入一个节点时打印 (,在离开一个节点时打印 )。因此,当他完成这次深度优先搜索时,在他的控制台中,他会看到一个长度为 2n2n 的括号序列,其中 nn 是树中顶点的数量。

显然,如果树是无向的,节点没有标记(意味着所有节点都是平等对待的),在进行深度优先搜索时,你可以得到许多不同的括号序列。这有两个原因。首先,当你在 curcur 时,你可以在访问 nxtnxt 时遵循 curcur 相邻的任意节点的任意排列。其次,在开始深度优先搜索时,树的入口,也就是根节点,是不确定的。

因此,Cuber QQ\text{Cuber QQ} 忍不住想知道他可能得到多少个不同的括号序列。由于答案可能非常大,输出它对 998244353998 244 353 取模的结果。

输入格式

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

对于每个测试用例,树以标准格式给出,你可能非常熟悉:

第一行 nn,树的大小;

然后 n1n-1 行,每行包含两个用空格分隔的整数 u,vu,v1u,vn1 \le u, v \le n ,uvu \ne v ),表示一条边。

所有测试用例中 nn 的总和不超过 3.2×1063.2 \times 10^6

输出格式

对于每个测试用例,输出一行答案。

3
4
1 3
2 3
4 3
5
1 2
2 3
3 4
4 5
5
1 2
2 3
3 4
3 5
2
4
8

样例分析

如上所述。

数据范围与提示

对于 100%100\% 的数据:1t1051 \le t \le 10^5, 1n1051 \le n \le 10^5