QOJ.ac

QOJ

実行時間制限: 1 s メモリ制限: 512 MB 満点: 100 難易度: [表示]

#37. 蜀道难

統計

小 Q 有两棵有根树,一棵叫 $A$,一棵叫 $B$。

这两棵有根树很奇怪:它们不仅有一个特定的结点即根结点,记作 $S_A, S_B$,还有一个特定的结点,姑且叫做“反根结点”,记作 $T_A, T_B$。我们姑且称这样的树(具有“根结点”和“反根结点”的树)叫做“双根树”。(注意,根结点和反根结点可能是同一个结点)

小 Q 想把它们乘起来形成一个新的双根树。这个操作是这样的(注:题面最后有一个形式化描述,以及例子):

  • 首先,对于 $A$ 上的每一个点 $a$,都把 $B$ 树复制一份,记作 $B_a$;
  • 然后若 $A$ 树上 $x$ 是 $y$ 的父亲,那么就在 $B_y$ 的根结点和 $B_x$ 的反根结点之间连一条边(事实上,后者会成为前者在新树上的父亲);
  • 新的树的根结点为 $B_{S_A}$ 的根结点,反根结点为 $B_{T_A}$ 的反根结点。

把这个新的双根树记作 $A \circ B$。容易发现 $A \circ B$ 的结点数等于两棵树的结点数之积。

现在小 Q 有一棵 $n$ 个结点的双根树 $A$,她构造了一棵新的树 $(\dots((A \circ A) \circ A) \dots \circ A) \circ A$(一共是 $k$ 个 $A$),显然这棵树上一共有 $n^k$ 个结点,她想知道所有 $\frac{n^k(n^k-1)}{2}$ 个点对之间的距离之和。由于这个数太大了,你只需要算出它对 $998244353$ 取模后的值即可。

输入格式

第一行四个正整数 $n, k, S, T$,分别表示双根树 $A$ 上的结点数、新的树是由多少个 $A$ 乘起来(即题目描述里的 $k$)以及 $A$ 树上的根结点编号和反根结点编号。

接下来 $n-1$ 行,每行两个数 $x, y$,表示 $A$ 上的一条边。保证给出的是一棵树。

输出格式

一行一个非负整数,表示所有点对间两两距离之和。

样例

样例输入 1

4 1 1 4
1 2
1 3
2 4

样例输出 1

10

样例输入 2

4 2 1 4
1 2
1 3
2 4

样例输出 2

488

样例输入 3, 4

见下发文件。 提示:分别满足第 4, 7 个子任务的性质。

数据范围

子任务编号 $n$ $k$ 特殊性质 子任务分值
1 $\le 100$ $= 1$ 5
2 $\le 3000$ $\le 10$ 10
3 $\le 10^5$ $\le 10$ $n^k \le 10^6$ 15
4 $\le 10^5$ $\le 1000$ 20
5 $\le 10^5$ $\le 10^9$ $S = T$ 10
6 $\le 10^5$ $\le 10^9$ 树是一条链,S 和 T 分别在链两端 10
7 $\le 10^5$ $\le 10^9$ 30

对所有的数据,$1 \le S, T, x, y \le n$。

说明

定义一棵双根树为有两个特殊结点,即根结点 $S$ 与反根结点 $T$ 的树。两棵双根树 $A, B$ 的乘积 $A \circ B$ 定义如下:

  • 树 $A \circ B$ 中共有 $n_A n_B$ 个结点($n_A, n_B$ 分别表示两棵树的结点数),以点对 $(i, j)$ 表示,其中 $1 \le i \le n_A, 1 \le j \le n_B$。
  • 对于所有 $1 \le u \le n_A, 1 \le v, w \le n_B$,若 $v, w$ 在 $B$ 中相邻,则 $(u, v), (u, w)$ 在 $A \circ B$ 中相邻。
  • 对于所有 $1 \le u, v \le n_A$,若 $A$ 中 $u$ 是 $v$ 的父亲(即,$u$ 与 $v$ 相邻,且前者距离 $S_A$ 更近),则 $(u, T_B), (v, S_B)$ 在 $A \circ B$ 中相邻。
  • $A \circ B$ 的根结点为 $(S_A, S_B)$,反根结点为 $(T_A, T_B)$。

图 1: 如图,展示了一种情况下 A, B, A ◦ B 三棵树的形态。每棵树的根用倒三角 ▽ 形状表示,反根用 △ 形状表示。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.