闲话/社论 23.1.12

u 群看到的一道题
挺好玩的,写篇博客

参考资料:
20210620省队互测-qwaszx 题解, qwaszx ;
某篇没有链接的知乎回答, EI,Rebelz .

定义一个 \(1,2,\cdots,n\) 的排列是好的,当且仅当不存在长为 \(m\) 的连续段,使得其中相邻两项的差的绝对值为 \(1\)。给定 \(n,m\),计数好的排列。答案对 \(1e9 + 7\) 取模。

\(n\le 10^7\)

容斥转生成函数。

使用如 CF1515E 的手法,我们可以将排列分割为数个极长的连续段,随后对每个连续段构造生成函数,枚举方案数 \(k\) 次幂之和即可。
然而我们会发现,两段极长的连续段相邻后可能会破坏极长的性质,这导致我们无法直接构造极长连续段的生成函数。

不妨从容斥的角度去着手,我们使用普通的连续段拼合成极长性质不会被破坏的极长连续段,这也就需要用到一组容斥系数来表示。我们设对应的容斥系数为 \(\langle f_i \rangle\),其 ogf 为 \(F\)。这个容斥系数的定义是由其作用确定的。也就是说,我们令 \(F\) 满足:一个长度为 \(k\) 的极长连续段的贡献为 \([x^k] \dfrac{1}{1 - F} = [l < m]\)
定义导出了 \(F = \dfrac{x - x^m}{1 - x^m}\)

我们可以发现,容斥系数 \(F[k]\) 其实就代表着 \(k\) 长度的连续段的贡献。因此考虑翻转的情况后就可以构造出连续段的 ogf

\[G(x) = F[1] + \sum_{k > 1} 2F[k] = 2F - F[1]x = \frac{2x - 2x^m}{1 - x^m} - x = \frac{x^{m + 1} - 2x^m + x}{1 - x^m} \]

\(m\) 较小时也可以直接构造 \(G\)。例如,当 \(m = 2\) 时可以观察 \(k\) 长度的连续段对答案的贡献,容易发现 \(k = 1\) 时为 \(1\),其余时刻容斥产生 \((-1)^{k - 1}\times 2\) 的系数。这导出了 \(\langle 0, 1, -2, 2, -2, 2, \cdots \rangle\) 的生成函数 \(\dfrac{x(1 - x)}{1 + x}\),对比系数即可。容易发现这和如上的形式是吻合的。或许通过归纳法也可以得到如上的 ogf 形式。

可以发现每一段都可以被最大值表示,这就可以使得决策 \(k\) 段即为决策 \(k\) 个数字。我们枚举段数 \(k\),随后通过 \(G^k(x)\) 得到 \(k\) 段连续段,最后分配 \(k\) 个数字得到答案

\[H(G(x)) = \sum_{k \ge 0} k! G^k(x) \]

到这里我们可以朴素地做多项式复合,但是复杂度仍然不够优秀。考虑采用整式递推技术。

我们可以发现 \(H(G(x))\) 微分有限。具体地,\(G(x)\) 是代数函数,因此被复合后可以保证微分有限。而 \(H(x)\) 的微分有限需要看出

\[\sum_{k \ge 0} k! x^k \]

是广义超几何函数形式,因此微分有限。具体地,我们可以套公式得到 \((1 - x)H(x) = x^2 H'(x) + 1\)。再化简一下就是

\[H'(x) = \frac{(1 - x)H(x) - 1}{x^2} \]

带入 \(x = G\) 得到

\[\frac{\text d H(G(x))}{\text d G(x)} = \frac{(1 - G(x))H(G(x)) - 1}{G^2(x)} \]

我们令 \(H'(G(x))\)\(H\) 的导数带入 \(G(x)\) 的结果,有

\[H'(G(x)) = \frac{G'(x)}{G^2(x)}\left(H(G(x)) - G(x)H(G(x)) - 1\right) \]

我们仅对 \(m = 2\) 的情况简要推导,对于 \(m\) 较大的情况可以采用 ODE 自动机,让机器帮你算递推式。

\(m = 2\) 时的 \(G\) 带入,设答案的生成函数为 \(A\),有

\[A' = \frac{1 - 2x - x^2}{x^2 - 2x^3 + x^4}\left(A \times \frac{1 + x^2}{1 + x} - 1\right) \]

再次展开得到经典形式

\[(x^2 - 2x^3 + x^4)(1 + x) A' = (1 - 2x - x^2)(1 + x^2) A - (1 + x)(1 - 2x - x^2) \]

接着展开?

\[(x^2 - x^3 - x^4 + x^5) A' = (1 - 2x - 2x^3 - x^4) A + (x^3 + 3x^2 + x - 1) \]

经过一些对比系数我们可以得到

\[A[n] = (n + 1)A[n-1] -(n - 2) A[n - 2] - (n - 5) A[n - 3] + (n - 3) A[n - 4] \]

这也是 bzoj4321\(O(n)\) 做法,\(A\) 数列又有 A002464 的名称。

Submission.

posted @ 2023-01-12 22:42  joke3579  阅读(143)  评论(0编辑  收藏  举报