#S44M3T4. 捉虫
捉虫
题目描述
小 Y 的朋友小 N 带她去森林里野餐。
她们在森林中遇到了一棵树,树由 个节点和 条边组成,且任意两个节点之间都能通过若干条边互相到达。
不过她们发现树上有很多虫子,于是她们决定清除这些虫子。
最开始,每个节点上都有虫子,她们可以选择一个节点,并在上面放置 只啄木鸟。
随后,她们可以进行若干次操作,每次操作可以选择一只啄木鸟,设其所在位置为 ,然后她们可以选择一个在树上和 有边相连的节点 ,并且把这只啄木鸟移动到 上。
任何时候只要某只啄木鸟到达树的某个节点,那么这个节点上的虫子就会被清除(包括初始选择的节点)。
每次移动完成后,如果一个没有啄木鸟的节点上的虫子已被清除,且该节点与至少一个有虫子的节点相邻,那么该节点会立刻重新出现虫子。该规则会反复触发,直到不存在满足条件的节点,她们的目标是使某一时刻所有节点上都没有虫子。
她们定义这棵树的“危险度”为:清除所有虫子所需要的啄木鸟数量的最小值,即初始放置的啄木鸟数量 的最小值。
野餐结束后,小 Y 开始研究不同形态的树,由于她只有 只啄木鸟,所以她只关心危险度不超过 的所有树。
具体来说,对于每个 ,小 Y 想让你帮她求出有多少种含有 个节点且危险度恰为 的无标号无根树,由于这个数可能很大,所以她还会告诉你一个质数 ,你只要输出答案对 取模后的结果即可。
无标号无根树只区分树的结构,不区分节点编号。若两棵树的节点之间存在一个双射,使得第一棵树中的两个节点有边相连,当且仅当它们在第二棵树中的对应节点有边相连,则这两棵树被视为同一种树,否则视为不同的树。
输入格式
从文件 worm.in 中读入数据。
第一行三个整数 ,表示树的节点数量,需要统计的最大危险度,以及答案所取的模数。
输出格式
输出到文件 worm.out 中。
输出一行 个整数。第 ()个整数表示含有 个节点,且危险度恰为 的无标号无根树数量对 取模后的结果。
样例 1 输入
6 3 998244353
样例 1 输出
1 5 0
样例 1 解释
只有 个点的链的“危险度”为 ,其他 种树的危险度都为 。
样例 2
见选手目录下的 worm/worm2.in 与 worm/worm2.ans。
该样例满足子任务 的约束条件。
样例 3
见选手目录下的 worm/worm3.in 与 worm/worm3.ans。
该样例满足子任务 的约束条件。
样例 4
见选手目录下的 worm/worm4.in 与 worm/worm4.ans。
该样例满足子任务 的约束条件。
样例 5
见选手目录下的 worm/worm5.in 与 worm/worm5.ans。
该样例满足子任务 的约束条件。
样例 6
见选手目录下的 worm/worm6.in 与 worm/worm6.ans。
该样例满足子任务 的约束条件。
样例 7
见选手目录下的 worm/worm7.in 与 worm/worm7.ans。
该样例满足子任务 的约束条件。
样例 8
见选手目录下的 worm/worm8.in 与 worm/worm8.ans。
该样例满足子任务 的约束条件。
样例 9
见选手目录下的 worm/worm9.in 与 worm/worm9.ans。
该样例满足子任务 的约束条件。
样例 10
见选手目录下的 worm/worm10.in 与 worm/worm10.ans。
该样例满足子任务 的约束条件。
数据范围
对于所有测试数据,保证 , 且 是素数。
| 子任务编号 | 特殊性质 | 分值 | ||
|---|---|---|---|---|
| 特殊性质 A | ||||
| ^ | ^ | |||
| ^ | ||||
| ^ | 特殊性质 B | |||
| 无特殊性质 | ||||
| ^ |
特殊性质 A:。
特殊性质 B: 为奇数。
本题开启所有合理的子任务依赖。
本题中,你可能需要较为快速地处理取模操作,下面给出一份 Barrett Reduction 的参考代码:
namespace FastMod {
typedef unsigned long long ull;
typedef __uint128_t uLL;
ull b; uLL m;
inline void init(const ull &B) { b=B,m=(uLL(1)<<64)/B; }
inline ull mod(const ull &a) {
ull r=a-((m*a)>>64)*b;
return r>=b?r-b:r;
}
}
Related
In following contests: