ARC146F Simple Solitaire 解题记录
题意:
以下的 \(\text{mex}\) 指集合内最小未出现的正整数减一的值。
对于给定的排列 \(P\),记它前 \(i\) 个元素的 \(\text{mex}\) 为 \(w_i\)。
给定 \(m\),一个长度为 \(n\) 的排列的权值定义为:
- 如果存在一个 \(i\) 满足 \(i-w_i \ge m\),则权值为 \(0\)。
- 否则,权值为 \(\prod_{i=1}^{n-1} (i-w_i)\)。
计数所有长度为 \(n\) 的排列的权值和。
\(2 \le m \le n \le 2\times 10^5\)
我们来考虑在第 \(i\) 个时刻时剩下的卡片的数量,记为 \(c_i\)。
答案相当于求 \(\prod c_i\),而限制相当于 \(c_i< m\)。
首先来分析 \(c_i\) 的性质,显然有 \(c_{i+1} \le c_i+1\)。
接下来考虑计算一个可能的 \(c_i\) 有多少个合法的 \(p\) 对应。
我们知道 \(c\) 一定是由几个每次加一的段拼成的。现在提取出那些满足 \(c_{i+1}\not=c_i+1\) 的位置 \(i\),构造序列 \(Y\) 依次含有所有满足条件的 \(i\) 和 \(i+1\),然后去掉 \(Y\) 最后一个元素(一定是 \(0\))。这样 \(Y\) 就可以描述所有产生“多吃至少一张牌”的时机。
使用 \(Y\) 描述的优越性在于易于表达出贡献相同的部分,而且方案数是容易取得的。
记一个 \(Y\) 的长度为 \(2k-1\),则显然其贡献为:
(忽略 \(2n\) 位置的贡献)
考虑方案数,我们知道每当多吃一张牌的时候,这张牌的方案数只有 \(1\),与此同时我们需要决策此前的一些卡牌将其钦定为一串需要被吃的卡牌。精细分析一下,方案数为:
那么总贡献就是
而对 \(Y\) 的限制,只需满足:
- \(Y_{2i-1}\ge Y_{2i}\)
- \(Y_{2i} \le Y_{2i+1}\)
- \(Y_i \in [1,m-1]\)
- \(\sum_{i=1}^{k-1} (Y_{2i-1}-Y_{2i}+1)+Y_{2k-1}=n\)
则相当于求出所有合法序列 \(Y\) 的贡献和。
尝试容斥掉第二个条件,此时可以发现 \(Y\) 相当于构成了几个逐步下降的序列拼接起来。
于是我们只需求出每个逐步下降的序列的方案数,就可以得到答案。
即对每个 \(n\) 求:
所有长度为 \(2k\) 的序列 \(Y\) 的贡献:
满足
- \(Y_{2i-1}\ge Y_{2i}\)
- \(Y_{2i} > Y_{2i+1}\)
- \(Y_i \in [1,m-1]\)
- \(\sum_{i=1}^{k-1} (Y_{2i-1}-Y_{2i}+1)+Y_{2k+1}=n\)
考虑一个朴素的 dp,记 \(dp_{i,j,0/1}\) 表示目前要求放的最后一个元素大于等于 \(i\)(而且上一个元素小于 \(i\)),目前第四个限制的和是 \(j\),放了 偶数/奇数 个元素,贡献的和。
(大概是每次放两个,放完第一个以后尝试把第二个往后推)
考虑转移,有:
写成生成函数形式,把 \(j\) 这一维合到一起,就相当于:
写出矩阵形式即可快速得到 \(F\)。
最后的答案肯定是由若干个 \(F\) 拼到一起,再续一个结尾是 \(0\) 的序列,
至于计算结尾为 \(0\) 的序列,只需把 \(M_1\) 改成:
即可。答案显然为 \(\dfrac{G_{1,0}}{1-F_{1,0}(x)}\)。
总复杂度 \(O(n\log^2 n)\),可以通过此题。
注意小细节,比如某些 \((-1)\) 的奇偶性。