杂题
题意
给定\(n\),对于\(k\in[0,n)\),分别计算对于排列\(\{1,2,\cdots,n\}\),进行最多\(k\)次操作,每次选择一个数字拿到前面或后面,形成的排列个数
\(n\le 1000\)
做法
最多进行\(k\)次操作等价于排列中最长上升子段长度\(\ge n-k\)
固定\(k\),下面考虑计算排列中最长上升子段长度\(\le k\)的方案数
直接做显然不好做,考虑构造容斥系数
我们想通过egf得到答案,\(ans=[x^n]\sum\limits_{i=1}^{\infty}(\sum\limits_{j=1}^{n}f_j\frac{x^j}{j!})^i\)
构造满足条件\(\sum\limits_{i=1}^{\infty}(\sum\limits_{j=1}^{n}f_jx^j)^i=\sum\limits_{i=1}^k x^i\)
令\(F(x)=\sum\limits_{i=1}^n f_ix^i\)
\(\begin{aligned}
\sum\limits_{i=1}^{\infty}F(x)^i&=\sum\limits_{i=1}^k x^i\\
1+\sum\limits_{i=1}^{\infty}F(x)^i&=\sum\limits_{i=0}^k x^i\\
\frac{1}{1-F(x)}&=\frac{x^{k+1}-1}{x-1}\\
F(x)&=1-\frac{x-1}{x^{k+1}-1}\\
F(x)&=\sum\limits_{i\ge 0}x^{(k+1)i+1}-\sum\limits_{i\ge 1}x^{(k+1)i}\\
\end{aligned}\)
由于\(F(x)\)有效位置并不多,暴力计算即可
\(O(n^2lnn)\)