#P50819. 「NOI2018」多边形
「NOI2018」多边形
题目描述
久莲是一个喜欢出题的女孩子。
在今年的 World Final 结束以后,久莲特别喜欢计算几何,于是她打算在 NOI 的考场上也出一个计算几何:这是一道只有题目名字和计算几何相关的题目。
首先,久莲给出了一棵 个节点的有根树 ,根节点编号为 。定义叶子节点为除了根以外所有度数恰好为 的节点。下图是一个树 的例子,其中叶子节点集合为 。
接着通过这棵树,久莲构造了一个序列 :
- 从根节点开始深度优先遍历整棵树,遍历时按照编号从小到大的顺序来访问孩子,这样可以得到一个树 的 DFS 序。
- 接着按照在 DFS 序中的出现顺序从前往后,久莲把所有叶子节点排成一排得到了一个序列 。
更进一步地,通过序列 ,久莲定义了两个叶子节点 的距离 :假设 在 中是第 个元素, 是第 个元素,则 。其中 为序列的长度,即 的叶子个数, 指的是出现的位置,从 开始计数。
上面的例子中,序列 为 ,其中 , 的出现位置分别为 。
最后,久莲给出了一个参数 ,利用这棵有根树 和序列 ,我们可以构造一张 个点的无重边无自环的无向图 :两个不同的点 之间有边当且仅当它们满足下列条件中的至少一个:
- 在树 中存在连接 的边。
- 在树 中 都是叶子节点且 。
当 或 时,上面的例子得到的图 都如下图所示:
现在久莲想让你来计算一下 中不同的哈密尔顿回路数量有多少条,答案可能很大,请对 取模后输出。
下面是一些补充定义:
- 无重边无自环的无向图 的一条哈密尔顿回路 是 中边的一个子集,其中每一个点恰好有两条不同的相邻边在 中,且任意两个点都可以通过 中的边直接或间接到达。
- 无重边无自环的无向图 的两条哈密尔顿回路 是不同的当且仅当存在一条边 使得 在 中且不在 中。
输入格式
从文件 polygon.in
中读入数据。
第一行输入两个整数 ,表示树 的点数以及久莲选定的参数 。
第二行输入 个整数 ,其中 表示树 上存在边 。
输出格式
输出到文件 polygon.out
中。
输出一行一个整数,表示哈密尔顿回路数量对 取模后的结果。
样例
5 1
1 1 2 2
2
该样例和题面中的例子完全相同。两条哈密尔顿回路经过节点的顺序分别为 和 。
数据范围与提示
各测试点的数据规模和性质如下表:
编号 | 特殊性质 | 编号 | 特殊性质 | ||||
---|---|---|---|---|---|---|---|
无 | A | ||||||
无 | |||||||
A | |||||||
A | |||||||
无 | |||||||
无 | |||||||
其中性质 A 为保证树上所有节点至多有两个孩子。
对于所有的数据,保证 。