杂题

题意

给定\(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)\)

posted @ 2020-11-01 09:55  Grice  阅读(81)  评论(0编辑  收藏  举报