#P16175. [ICPC 2014 NAIPC] Cheats

[ICPC 2014 NAIPC] Cheats

题目描述

Cosmo 正在玩一款鲜为人知的《塞尔达传说》系列最新作《天剑·黄昏时空之影》。在这款游戏中,玩家需要作为年轻的冒险者林克完成全部 nn 个目标。然而,某些目标必须在其他目标之前完成!每个目标 iii=2..ni = 2..n)都有一个前置目标 PiP_i,必须在 ii 之前完成。当然,第一个目标(总是编号 1)没有前置目标。依赖关系不会形成循环,即不存在间接依赖于自身的目标。

然而,与所有游戏一样,这款游戏中也有隐藏的作弊码。对于每个目标 i=2..ni = 2..n,都有一个作弊码,允许它在其前置目标之前完成!但是,事情不能太出格。如果目标 ii 的作弊码被使用,那么目标 ii 不需要在其前置目标 PiP_i 之后完成,而只需在其前置目标的前置目标 PPiP_{P_i} 之后完成即可(如果 Pi=1P_i = 1,则它可以在任何时刻完成,因为目标 1 没有前置目标)。此外,多个作弊码靠得太近可能会导致不可预测的效果,因此每个目标最多只能涉及一次作弊码的使用。换句话说,如果你对目标 ii 使用作弊码,使其可以在其前置目标 PiP_i 之前完成,那么你就不能对 PiP_i 使用作弊码,也不能对任何以 ii 为前置目标的其他目标使用作弊码。

Cosmo 希望在至多使用 kk 次作弊码的情况下完成游戏。在满足这些约束的条件下,他有多少种不同的完成所有 nn 个目标的顺序?由于这个值可能非常大,请输出它对 109+710^9+7 取模的结果。

输入格式

输入中有多个测试用例。每个测试用例的第一行包含两个整数 nn1n2001 \leq n \leq 200)和 kk0k<n0 \leq k < n),表示 Cosmo 必须完成的目标数量(nn)和他愿意使用的最大作弊次数(kk)。下一行包含 n1n-1 个空格分隔的整数 pp1pn1 \leq p \leq n),表示目标 2, 3, ..., nn 的前置目标(跳过目标 1,因为它没有前置目标)。输入以一行两个 0 结束。测试数据大小约 13 KB。

输出格式

对于每个测试用例,输出一个整数,表示 Cosmo 在使用不超过 kk 次作弊码的情况下,能够完成所有 nn 个目标的方案数。输出该数字对 109+710^9+7 取模的结果。不要输出任何空格,也不要在答案之间打印空行。

5 1
1 1 5 1
0 0
38

提示

下表列出了在样例输入/输出中,Cosmo 使用至多一次作弊码完成所有目标的所有顺序。

:::align{center} :::

翻译由 DeepSeek V3.2 完成