闲话/社论 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
当 \(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))\) 微分有限。具体地,\(G(x)\) 是代数函数,因此被复合后可以保证微分有限。而 \(H(x)\) 的微分有限需要看出
是广义超几何函数形式,因此微分有限。具体地,我们可以套公式得到 \((1 - x)H(x) = x^2 H'(x) + 1\)。再化简一下就是
带入 \(x = G\) 得到
我们令 \(H'(G(x))\) 为 \(H\) 的导数带入 \(G(x)\) 的结果,有
我们仅对 \(m = 2\) 的情况简要推导,对于 \(m\) 较大的情况可以采用 ODE 自动机,让机器帮你算递推式。
将 \(m = 2\) 时的 \(G\) 带入,设答案的生成函数为 \(A\),有
再次展开得到经典形式
接着展开?
经过一些对比系数我们可以得到
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat230112.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。