QOJ.ac

QOJ

Limite de temps : 5.0 s Limite de mémoire : 512 MB Points totaux : 100 Hackable ✓

#17634. Sasha 的任务

Statistiques

Sasha 最近搬进了一栋多层建筑。这栋建筑共有 $n$ 层,编号从 $1$ 到 $n$。每一层都住着一名居民。楼层之间有 $n-1$ 条楼梯,这些楼梯不一定是在相邻楼层之间建造的。已知除了第一层外,每一层都恰好有一条通往更低楼层的楼梯。对于第 $i$ 层($2 \le i \le n$),这条楼梯通往编号为 $p_i$ 的楼层。

Sasha 计划完成 $k$ 个任务,编号从 $1$ 到 $k$。对于编号为 $i$ 的任务,Sasha 计算出在编号为 $x_i$ 的楼层完成该任务最为理想。由于这些任务各不相同,所有的 $x_i$ 值互不相同。

独自完成任务很无聊,因此对于每个任务,Sasha 都想邀请至少一名居民一起完成。然而,大楼里的居民非常讨厌爬楼梯,他们只愿意下楼前往任务所在的楼层。因此,Sasha 只有在存在一条从楼层 $j$ 到楼层 $x_i$ 的路径(使用若干条,可能为零条,每次都通往更低楼层的楼梯)时,才能邀请楼层 $j$ 的居民完成任务 $i$。也就是说,只有当 $j = x_i$ 或 $p_j = x_i$,或者 $p_{p_j} = x_i$ 等情况时,楼层 $j$ 的居民才能完成任务 $i$。

居民们非常讨厌不必要地走楼梯。因此,如果 Sasha 邀请了一组人来完成一个任务,他们只愿意聚集在他们所有人都能下楼到达的最高楼层来完成该任务。例如,如果有一条从 3 层到 2 层的楼梯,那么 Sasha 就不能邀请 2 层和 3 层的居民在 1 层完成任务,因为所有居民本可以在更高的楼层聚集。

Sasha 不喜欢显得过于打扰,所以他邀请每一层的居民完成任务的数量不超过一个。同时,他可以选择不邀请某些楼层的居民来完成任务。

Sasha 还有一个他不会与任何人分享的秘密任务。但在他告诉你之前,你需要帮他计算出邀请居民与他一起完成任务的不同方案数,并确保满足所有限制条件。如果至少有一个任务是由不同的居民集合完成的,则认为两种方案不同。

输入格式

第一行包含两个整数 $n$ 和 $k$ ($3 \le n \le 10^6$, $1 \le k \le \min(n, 2000)$) —— 大楼的楼层数和任务数。

第二行包含 $k$ 个整数 $x_1, x_2, \dots, x_k$ ($1 \le x_i \le n$) —— Sasha 将要完成任务的楼层。保证所有 $x_i$ 互不相同。

第三行包含 $n-1$ 个整数 $p_2, p_3, \dots, p_n$ ($1 \le p_i < i$),其中 $p_i$ 描述了从第 $i$ 层通往更低楼层的楼梯所到达的楼层编号。

输出格式

输出一个数字 —— 邀请大楼居民与 Sasha 一起完成任务的不同方案数,对 $998\,244\,353$ 取模。

样例

输入格式 1

3 1
1
1 1

输出格式 1

5

说明

在第一个样例中,Sasha 有五种邀请居民的方式: 仅邀请 1 层的居民; 邀请 1 层和 2 层的居民; 邀请 1 层和 3 层的居民; 邀请 1 层、2 层和 3 层的居民; * 邀请 2 层和 3 层的居民;

Sasha 不能单独邀请 2 层的居民来完成任务,因为那样的话,所有愿意完成任务的居民能聚集的最高楼层将是 2 层,而 Sasha 希望在 1 层完成任务。

输入格式 2

6 2
2 5
1 2 3 4 5

输出格式 2

12

说明

在第二个样例中,两种不同的合适方案如下: 邀请 2 层和 6 层的居民完成第一个任务,邀请 5 层的居民完成第二个任务。 邀请 2 层的居民完成第一个任务,邀请 5 层和 6 层的居民完成第二个任务。

输入格式 3

7 3
2 7 1
1 1 2 2 3 3

输出格式 3

62

子任务

组别 分数 $n$ $k$ 所需组别 说明
0 0 样例测试
1 12 $n \le 10$ $k \le 10$ 0
2 13 $n \le 500$ $k \le 500$ 0, 1
3 9 $k = 1$
4 10 $p_i = i - 1$
5 13 4 每一层连接到更高楼层的楼层不超过两个
6 14 $n \le 200\,000$ $k \le 500$ 0 - 2
7 11 $k \le 500$ 0 - 3, 6
8 10 $k \le 1000$ 0 - 3, 6, 7
9 8 0 - 8 离线验证

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.