P10002 [集训队互测 2023] 树哈希
题目描述
这是一道 [模板题](https://uoj.ac/problem/763)。
给定正整数 $n,q,mod$。保证 $mod$ 是质数。
对于一棵以点 $1$ 为根的有根树 $T$,设 $s(T)$ 为这棵树中最多能选出多少个互不同构的子树(也就是这颗树本质不同的子树个数),那么这个树的权值 $w(T) = q^{s(T)}$。
对于所有 $1 \le m \le n$,输出所有大小为 $m$,根为 $1$ 的有标号树的权值之和对 $mod$ 取模后的值。
两棵有根树 $T_1$、$T_2$ 同构当且仅当他们的大小相等,且存在一个顶点排列 $\sigma$ 使得在 $T_1$ 中 $i$ 是 $j$ 的祖先当且仅当在 $T_2$ 中 $\sigma(i)$ 是 $\sigma(j)$ 的祖先。
输入格式
一行两个整数,表示 $n,q,mod$。
输出格式
输出 $n$ 行,第 $m$ 行表示 $m$ 个点的答案。
说明/提示
#### 样例解释 1
$n=3,q=2,mod=998244353$ 时,有三颗不同三个点的根为 $1$ 的有标号树,其中两颗满足 $w(T)=2^3$,另一颗满足 $w(T)=2^2$。因此答案为 $(2 \times 2^3+2^2) \bmod 998244353 = 20$。
#### 限制与约定
对于所有测试数据,保证 $n = 100, 10^8 \le mod \le 1.01 \times 10^9, 1 \le q < mod$,且 $mod$ 是质数。
本题共 $1$ 个子任务,每个子任务 $100$ 分。你在每个子任务中的得分为该子任务所有测试点的得分的最小值。
**你必须按照输出格式输出 $n$ 个数,但是你可以输出错误的答案**。如果你输出了 $c$ 个正确的答案,那么你获得的分数按照如下方式计算:
- 对于 $0 \le c \le 20$,你的得分为 $2c$ 分;
- 对于 $21 \le c \le 60$,你的得分为 $c + 20 $ 分。
- 对于 $61 \le c \le 100$,你的得分为 $\lfloor \frac{c}{2}\rfloor + 50$ 分。
时间限制:$\texttt{4s}$。
空间限制:$\texttt{2048MB}$。
你可以使用下面的代码来加速你的取模。
```cpp
struct fastmod {
typedef unsigned long long u64;
typedef __uint128_t u128;
int m;
u64 b;
fastmod(int m) : m(m), b(((u128)1 > 64;
int r = a - q * m;
return r < m ? r : r - m;
}
} z(2);
void solve() {
long long mod = 998244353, qwq = 1e9;
z = fastmod(mod);
cout