ARC068F Solitaire
题意
将 \(1\dots n\) 依次加入一个双端队列,然后再一个一个弹出,要求得到的第 \(k\) 个数是 \(1\),求得到的排列有多少种。
做法
我们首先考虑 \(n = k\) 的问题。经过简单的转化不难发现,我们实际上是在数有多少个长度为 \(n-1\) 的排列可以被划分成两个上升子序列。考虑这样的贪心:所有前缀最大值都被放入到第一个上升子序列,剩下的数放入第二个。容易证明如果合法,一定可以这样划分。那么我们只关心第二个上升子序列的最大值在当前前缀的排名。设 \(f(m, i)\) 表示长度为 \(m\) 的子序列,第二个上升子序列的最大值排名为 \(i(0\le i\le m-1)\),那么有转移:
所以 \(f(m, i)\) 实际上表示从 \((1, 0)\) 开始,走到 \((m, i)\),且过程中始终有 \(y\le x-1\),这个题目最早在商朝的青铜器上就有记载,反射容斥一下容易发现 \(f(m,i) = \binom{m-1+i}{i} - \binom{m-1+i}{i-1} = \frac{m-i}{i}\binom{m+i-1}{i-1}\)。不难发现 \(n = k\) 时答案为 \(\sum\limits_{i=0}^{n-2}f(n-1, i) = f(n, n-1) = \frac{1}{n}\binom{2n-2}{n-1}\)。
下面考虑 \(n \neq k\),一开始的想法是枚举一些东西然后推式子,但是因为形式太复杂最终以失败告终(也许能行)。我们实际上需要限制 \(n\) 的位置在 \(k\)。考虑逆排列,它合法当且仅当原排列合法,那么我们实际上限制了最后一个元素是 \(k\);而当 \(k\neq n\) 时,这个元素一定在第二个子序列中,并且是它的最大值。所以此时答案即是 \(2^{n-k-1}f(n, k) = 2^{n-k-1}\left(\binom{n+k-1}{k}-\binom{n+k-1}{k-1}\right)\)。