排列计数[luogu5825]

题意

对于所有长度为 $n$ 的排列 $p$,求有 $k$ 个 $i$ 满足 $p_i<p_{i+1}$ 的方案数。

对于所有的 $k$ 都要算。

$n\leq 2\times 10^5$

题解

有一个较为简单的DP,顺次考虑将 $i$ 插入进排列,转移很简单,时间复杂度 $O(n^2)$。

然后你发现做不下去了,考虑至少容斥,设 $F_i$ 为答案,$G_k$ 为至少有 $k$ 个 $i$ 满足条件的方案数。那么最后二项式反演+ntt即可算出 $F$。

考虑钦定了 $k$ 个位置的小于号,然后将连续的小于号的搞成一个连续段,那么将有 $n-k$ 个连续段,且如果知道了段内的数组,那么段内的顺序也是确定的。

假设段的长度为 $x_1,x_2\cdots,x_m$,那么一共有 $\frac{n!}{\prod_{i=1}^m x_i}$ 个贡献,要求满足 $x_i\geq 1$

考虑用生成函数解决:

$$G _ k=[x ^ n]((\sum _ {i=0} \frac{x ^ i}{i!})-1) ^ {n-k}=[x ^ n] (e ^ x-1) ^ {n-k}$$

设 $m=n-k$,则:

$$x^n^m=\sum_{i=0}^m[x^n]e^{xi}(-1)^{m-i}\binom{m}{i}=\sum_{i=0}^m\frac{i^n}{n!}(-1)^{m-i}\binom{m}{i}$$

搞一个ntt就好了。

时间复杂度 $O(n\log n)$。

程序

懒得搞了,反正很简单。