本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-10 09:38:26
:::::info[题目基本信息]
考察:动态规划 DP,逆元,拓扑排序,组合数学,数学(省选/NOI-)。
题目简介:
给定一棵有 $n$ 个点的数,它以 $1$ 为根,设 $f_i$ 为 $i$ 点的父亲(特别地,定义 $f_1=0$),定义拓扑序为:一个排列 $\{p_n\}$,满足:
- $\forall 1\le i<j\le n,p_j\ne f_{p_i}$
对于每个 $i\in[1,n]$,求有多少拓扑序满足 $p_i=i$(对 $998244353$ 取模)。
数据范围:
- $2\le n\le 5000$
- $\forall i\in[2,n],1\le f_i<i$
时间限制:2s。
空间限制:1G。
:::::
结论:设 $g_u$ 为只考虑 $u$ 子树内时拓扑序个数,则 $\displaystyle g_u=\frac{siz_u!}{\prod_{v\in\text{sub}u}siz_v}$,其中 $\text{sub}_u$ 表示 $u$ 子树内的结点构成的集合,$siz_u$ 表示 $u$ 的子树大小。
:::::success[证明]{open}
考虑数学归纳法。
当 $siz_u=1$ 时,$\displaystyle g_u=\frac{siz_u!}{\prod{v\in\text{sub}u}siz_v}=1$,显然成立。
当 $siz_u\ne 1$ 时,假设 $\forall v\in\text{son}_u$ 都满足条件,其中 $\text{son}_u$ 表示 $u$ 点的儿子构成的集合。
那么根据定义,我们可以得到 $g_u$ 的转移方程式为:
$$g_u=\frac{(siz_u-1)!}{\prod{v\in\text{son}u}siz_v!}\cdot\prod{v\in\text{son}u}g_v$$
我们将 $\displaystyle g_v=\frac{siz_v!}{\prod{w\in\text{sub}v}siz_w}$ 代入推导:
$$\begin{aligned}g_u&=\frac{(siz_u-1)!}{\prod{v\in\text{son}u}siz_v!}\cdot\prod{v\in\text{son}u}g_v\&=\frac{(siz_u-1)!}{\prod{v\in\text{son}u}siz_v!}\cdot\prod{v\in\text{son}u}\frac{siz_v!}{\prod{w\in\text{sub}v}siz_w}\&=\frac{(siz_u-1)!}{\prod{v\in\text{son}u}\prod{w\in\text{sub}v}siz_w}\&=\frac{(siz_u-1)!}{\prod{v\in\complement{\text{sub}u}\{u\}}siz_v}\&=\frac{siz_u!}{\prod{v\in\text{sub}u}siz_v}\end{aligned}$$
证毕。
:::::
证明完了上面的结论,我们直接考虑 DP,设 $f{u,i}$ 为不考虑 $u$ 子树(除 $u$ 外)内的情况下,$p_u=i$ 的方案数,显然可以得到 $f_{1,1}=1$,考虑从根到叶子进行 DFS,同时进行 DP。
考虑从 $f_{u,i}$ 转移到 $f_{v,j}$($i<j$),这时我们需要考虑 $\complement_{\text{sub}u}\text{sub}_v\cup\{u\}$ 这部分的贡献,注意到这部分变成了一个子树,我们就可以套用上面的结论,同时也要乘上 $\displaystyle\binom{n-i-siz_v}{siz_u-siz_v-1}$ 表示在未填的位置上选出一些位置填上,我们就得到了转移方程式:
$$f{v,j}=\sum_{i=1}^{j-1}f_{u,i}\binom{n-i-siz_v}{siz_u-siz_v-1}\cdot\frac{(siz_u-siz_v-1)!}{\prod_{v\in\complement{\text{sub}u}\text{sub}_v\cup\{u\}}siz_v}$$
但是这个转移方程式实现出来是 $\Theta(n^3)$,注意到这个转移方程式跟 $j$ 半毛钱关系都没有,我们考虑差分。
具体地,令 $j\leftarrow j-1$,我们得到:
$$f{v,j-1}=\sum_{i=1}^{j-2}f_{u,i}\binom{n-i-siz_v}{siz_u-siz_v-1}\cdot\frac{(siz_u-siz_v-1)!}{\prod_{v\in\complement{\text{sub}u}\text{sub}_v\cup\{u\}}siz_v}$$
两式相减,得到:
$$f{v,j}-f_{v,j-1}=f_{u,j-1}\binom{n-j-siz_v+1}{siz_u-siz_v-1}\cdot\frac{(siz_u-siz_v-1)!}{\prod_{v\in\complement{\text{sub}u}\text{sub}_v\cup\{u\}}siz_v}$$
自然得到:
$$f{v,j}=f_{v,j-1}+f_{u,j-1}\binom{n-j-siz_v+1}{siz_u-siz_v-1}\cdot\frac{(siz_u-siz_v-1)!}{\prod_{v\in\complement{\text{sub}u}\text{sub}_v\cup\{u\}}siz_v}$$
我们设 $cnt_u=\prod{v\in\text{sub}u}siz_v$,上式就变为:
$$f{v,j}=f_{v,j-1}+f_{u,j-1}\binom{n-j-siz_v+1}{siz_u-siz_v-1}\cdot\frac{(siz_u-siz_v-1)!}{cnt_u\div siz_u\div cnt_v}$$
这个东西预处理阶乘和逆元就可以达到可接受的复杂度了,最后的答案 $ans_u$ 就为:
$$ans_u=f_{u,u}\binom{n-u}{siz_u-1}\cdot \frac{siz_u!}{cnt_u}$$
时间复杂度为 $\Theta(n^2)$(实现较劣会变为 $\Theta(n^2\log p)$,其中 $p$ 是模数,不知道能不能过),空间复杂度为 $\Theta(n^2)$。

:::::
运用邻项交换法,若两个字符串 $a$ 和 $b$ 进行比较,则若 $a+b<b+a$($+$ 在这里表示字符串拼接),则 $a$ 应在前面。
根据这个方式排序即可。
时间复杂度为 $\displaystyle\Theta(\sum|s|\log n)$(在这里 $\displaystyle\sum|s|=\sum_{i=1}^n|s_i|$,下同),空间复杂度为 $\displaystyle\Theta(\sum|s|)$。
鲁ICP备2025150228号