在日本某处的一个动物园里,饲养员们决定和水豚们玩以下游戏。
水豚的围栏由 个温泉组成,编号从 到 。这些温泉由 条走道连接。每条走道连接两个温泉,并且可以从任何一个温泉通过这些走道到达任何其他温泉。换句话说,水豚围栏的结构是一棵树(即一个无向连通无环图)。
最初,每个温泉中最多只有一只水豚,但这在游戏过程中可能会改变。
游戏包含数轮(可能是无限轮)。每轮有两个阶段:
- 饲养员会将一个橘子扔进 个温泉中的一个。水豚们会知道橘子被扔进了哪个温泉。
- 最多一只水豚可以移动到相邻的温泉。之后,如果装有橘子的温泉里没有水豚,则饲养员获胜,水豚失败。否则,橘子被吃掉,游戏继续。
一个初始配置(即最初包含水豚的温泉集合)是安全的,如果当饲养员和水豚都采取最优策略时,饲养员无法在有限轮内获胜。
对于从 到 的每个 ,找出恰好有 只水豚的安全初始配置的数量。由于这些数字可能非常大,请找出它们对 取模的余数。
实现细节
你将需要实现以下函数:
std::vector<int> solve(int N, std::vector<int> U, std::vector<int> V)
该函数由评分器调用一次,并应返回一个长度为 的 std::vector<int>,其中包含对于每个 ,恰好有 只水豚的安全初始配置的数量(对 取模)。
此函数的参数具有以下含义:
- - 温泉的数量。
- - 一个长度为 的
std::vector<int>,包含 条走道中每条的第一个端点。
- - 一个长度为 的
std::vector<int>,包含 条走道中每条的第二个端点。
对于每个 ,第 条走道连接温泉 和 。