题解:AT_arc140_f [ARC140F] ABS Permutation (Count ver.)

· · 题解

来一个重工业垃圾做法。

solution

看一眼题目,限制要求是 |P_i-P_{i+1}=M|,看起来像是要转成一个差为 1 的形式,要不然不太好刻画。但是我转化完之后生成函数推错了。所以考虑一个别的转化。

考虑图论建模。

这等价于在图 G=(V, E) 中(其中 (u, v) \in E \iff |u-v|=M),选取一些边使得它们在排列中相邻。

G 是由若干条不相交的路径组成的。

N = qM + r,则图 G 包含:

由于对于我们选出的一组连通块,点的访问顺序是有区分的。所以我们要求的实际上是从 G 中的这些链里面选出 k 条边后的带权方案。

如果一个连通块大小大于 1 那么就会有两种顺序。所以如果一个连通块大小大于 1 那么权值就是 2

于是设 f_n(x) 为长度为 n 的链的生成函数。我们的目标是求出 f_n(x)

这等价于:用若干段长度为 L_i 的线段覆盖长度为 n 的区间(\sum L_i = n),所有段的权值乘积之和。

考虑 dp。设最后一段的长度为 k

将所有可能的情况求和,得到 f_n(x) 的表达式:

f_n(x) = 1 \cdot f_{n-1}(x) + \sum_{k=2}^{n} 2x^{k-1} f_{n-k}(x)

为了求解这个和式,我们列出 f_nf_{n-1} 的展开式进行错位相减。

f_n = f_{n-1} + 2x f_{n-2} + 2x^2 f_{n-3} + \dots + 2x^{n-1} f_0 f_{n-1} = f_{n-2} + 2x f_{n-3} + \dots + 2x^{n-2} f_0 x f_{n-1} = x f_{n-2} + 2x^2 f_{n-3} + \dots + 2x^{n-1} f_0

做差 f_n - x f_{n-1}: 观察 f_nx f_{n-1} 的后半部分:

相减得:

f_n - x f_{n-1} = f_{n-1} + 2x f_{n-2} - x f_{n-2} f_n - x f_{n-1} = f_{n-1} + x f_{n-2} f_n = (1+x) f_{n-1} + x f_{n-2}

因为实际上只需要算出一项,所以直接矩阵快速幂优化一下即可。

对于一条长链,我们有线性递推关系:

\begin{pmatrix} f_{n} \\ f_{n-1} \end{pmatrix} = \begin{pmatrix} 1+x & x \\ 1 & 0 \end{pmatrix} \begin{pmatrix} f_{n-1} \\ f_{n-2} \end{pmatrix}

设转移矩阵 T = \begin{pmatrix} 1+x & x \\ 1 & 0 \end{pmatrix}。 则:

\begin{pmatrix} f_{q+1} \\ f_{q} \end{pmatrix} = T^q \begin{pmatrix} f_{1} \\ f_{0} \end{pmatrix} = T^q \begin{pmatrix} 1 \\ 1 \end{pmatrix}

得到 f_qf_{q+1} 之后就可以求出原来的总生成函数了。

f(x)=f_q^{m-r}\times f_{q+1}^{r}

多项式 \ln,\exp 做一下即可。

于是乎 [x^k]f(x) 就是在整个图中选 k 条边并考虑方向的方案数。

g_k=[x^k]f(x)E_k 表示恰好有 k 条边的排列数,H_k 表示钦定选了 k 条边,剩下 n-k 个连通块任意排列的方案数。

根据排列的性质: 如果我们在图中选了 k 条边,这些边构成了若干连通块。总共有 n-k 个连通块。 这 n-k 个连通块看作整体,在排列中可以任意打乱顺序。 所以:

H_k = g_k \times (n-k)!

二项式反演一下:

E_k = \sum_{j=k}^{n-1} (-1)^{j-k} \binom{j}{k} H_j

这个东西直接拆一下组合数上 NTT 就做完了。

submission。