loj#P3711. 「ZJOI2022」深搜

「ZJOI2022」深搜

题目描述

九条可怜是一个喜欢算法的女孩子,在众多算法中她尤其喜欢深度优先搜索(DFS)。

有一天,可怜得到了一棵有根树,树根为 root\mathit{root},树上每个节点 xx 有一个权值 axa_x

在一棵树上从 xx 出发,寻找 yy 节点,如果使用深度优先搜索,则可描述为以下演算过程:

  1. 将递归栈设置为空。
  2. 首先将节点 xx 放入递归栈中。
  3. 从递归栈中取出栈顶节点,如果该节点为 yy,则结束演算过程;否则,如果存在未访问的直接子节点,则以均等概率随机选择一个子节点加入递归栈中。
  4. 重复步骤 3,直到不存在未访问的直接子节点。
  5. 将上一级节点加入递归栈中,重复步骤 3。
  6. 重复步骤 5,直至当前一级节点为 xx,演算过程结束。

我们定义 f(x,y)f(x, y) 合法当且仅当 yyxx 的子树中。它的值为从 xx 出发,对 xx 的子树进行深度优先搜索寻找 yy 期间访问过的所有节点(包括 xxyy)权值最小值的期望。

九条可怜想知道对于所有合法的点对 (x,y)(x, y)f(x,y)\sum f(x, y) 的值。你只需要输出答案对 998244353998244353 取模的结果。具体地,如果答案的最简分数表示为 ab\frac{a}{b},输出 a×b1mod998244353a \times b^{-1} \bmod 998244353

输入格式

输入包含多组数据,第一行输入数据组数 TT

对于接下来的每组数据,第一行两个整数 n,rootn, \mathit{root},分别表示树的大小,树根的编号。

接下来一行 nn 个整数 a1,a2,,ana_1, a_2, \ldots, a_n,表示树上每个节点的权值。

接下来 n1n - 1 行,每行包含两个整数 u,vu, v,表示 uuvv 之间有一条树边。

输出格式

对于每组数据,输出一行,包含一个整数,代表对于所有合法点对 (x,y)(x, y)f(x,y)\sum f(x, y)998244353998244353 取模的结果。

4
1 1
1
3 3
3 3 4
3 1
3 2
6 1
5 2 4 1 3 6
1 2
1 6
2 3
2 4
4 5
5 1
5 4 3 2 1
1 2
1 3
3 4
3 5

1
16
34
499122202

样例 2

见附加文件下的 [dfs_ex2.in](file:dfs_ex2.in) 与 [dfs_ex2.ans](file:dfs_ex2.ans)。

数据范围与提示

对于所有测试点,满足 1T1001 \le T \le 100n8×105\sum n \le 8 \times {10}^51n4×1051 \le n \le 4 \times {10}^51root,u,vn1 \le \mathit{root}, u, v \le n1ai1091 \le a_i \le {10}^9

每个测试点的具体限制见下表:

测试点编号 n\sum n \le nn \le 特殊限制
11 5050 1010
242 \sim 4 4000040000 50005000
5105 \sim 10 4×1054 \times {10}^5 105{10}^5
1111 8×1058 \times {10}^5 4×1054 \times {10}^5 树的生成方式随机
1212 树是一条链
1313 根的度数为 n1n - 1
142014 \sim 20

对于测试点 1111,树的生成方式为:以 11 为根,对于节点 i[2,n]i \in [2, n],从 [1,i1][1, i - 1] 中等概率随机选择一个点作为父亲。之后将编号随机重排。