题意简述
一个排列,给出右端点为 $i$ 的最长连续段长度 $L_i$,求可能的排列总数对 $998244353$ 取模。
不超过 $100$ 组数据,$n\le 5\times 10^4$。
主要思路
下称「非平凡连续段」为长度大于一的连续段。
由于连续段的交与并也是连续段,因此一个合法的输入连边相交线段应当构成一个树形结构。
考虑一个节点的子树,其对应的区间值域连续,且其不能出现在更大的连续区间中,因此可以等效地看成一个数。
因此,记 $f_n$ 为长度为 $n$ 的,去掉最后一个元素后不存在非平凡连续段的排列个数,$son_n$ 表示点 $n$ 的子节点个数。
则答案为 $\prod\limits_{i=1}^{n}f_{son_i}$。
现在我们考虑如何求出 $f$。
去掉最后一个元素后不存在非平凡连续段的排列的逆排列即不存在不包含最大值的非平凡连续段的排列,显然其个数与不存在不包含最小值的非平凡连续段的排列相同。那么考虑加上排列的最小值,此时排列长度为 $n+1$。
- 排列原先已满足不存在不包含最小值的非平凡连续段。
那么只需不与次小值相邻即可,故有 $n - 1$ 个插入位置。 - 排列原先存在不包含最小值的非平凡连续段。
枚举其中不包含最小值的非平凡连续段的最大长度 $j$($j\in[2, n - 2]$),其值域应不包含最小值 $2$,共 $n - j - 1$ 种取值。插入最小值 $1$ 后,该区间及全局都不再存在不包含最小值的非平凡连续段,故可行的排列数为 $f_jf_{n-j}$。
于是递推式即为 $f_n = (n-1)f_{n-1} +\sum\limits_{j=2}^{n-2}(n-j-1)f_jf_{n-j}$。分治 FFT 即可。
参考代码
这个分治 FFT 由于是自己更新自己的,如果按照正常方法,左端点为整个分治的左端点时会有部分未处理完全,就会出问题。
所以要改一改,具体都写在代码里了。
1 |
|