luogu-P7438~P7440题解

前言

在 24 年我新高一的那个暑假学长讲课讲了这个题的超级弱化版 P7438,后来看到这题还有两个加强版于是就想着能不能把加强版搞定然后再回去交弱化版。事实证明我太天真了,我当时想了很久都不会,后面看了一下题解发现有什么偏导、拉反、复合之类,遂放弃。后来也有几次想尝试做这个三连但最后都未果,这次想着我已经有一点数学基础并且也全停课了就尝试做这三道题,并写一篇题解纪念。

在写这篇题解的时候笔者查阅了一些资料,有的地方还参考了其他的题解,在文章最后会写明出处。本文如有谬误,还请诸位大神耐心指出。

题意

\(\text{cyc}_\pi\) 将长为 \(n\) 的排列 \(\pi\) 当成置换时所能分解成的循环个数。给定两个整数 \(n,k\) 和一个 \(k-1\) 次多项式,对 \(1\leq m\leq n\) 求:

\[\sum\limits_{\pi}F(\text{cyc}_{\pi}) \]

其中 \(\pi\) 是长度为 \(m\) 且不存在位置 \(i\) 使得 \(\pi_i=i\) 的排列。

P7438 题解

数据范围:\(1\le n\le 6\times10^5,1\le k\le100\)

首先我们要把 \(F\) 写成牛顿级数的形式:

\[F(\text{cyc}_\pi)=\sum_{i=0}^kf_i{\text{cyc}_\pi\choose i} \]

代入可得:

\[\sum_{i=0}^kf_i\sum_\pi{\text{cyc}_\pi\choose i} \]

现在只需要算 \(f_i\) 的系数即可。后面这个东西翻译成人话就是对所有错排求环数选 \(i\) 个的答案。现在有一个思路是我们尝试用生成函数去刻画出错排和环的信息,然后提取系数。接下来开始刻画生成函数。

错排的 \(\text{EGF}\)

得到错排的 \(\text{EGF}\) 的方法有许多,这里只讲一种笔者认为最便捷的。我们从置换环的角度入手,错排满足不存在长度为一的置换环。不存在长度为一的置换环这东西可以刻画出来:

\[\sum_{i>1}{x^i\over i}=-\ln(1-x)-x \]

推导考虑先将左边补一项,然后求导即可。然后求错排的 \(\text{EGF}\) 就直接 \(\exp\) 即可。现在考虑将循环数的信息放进去,我们加一元,用 \(G(x,y)=e^{(1+y)(-\ln(1-x)-x)}\) 表示。

有了生成函数后我们只需要快速得到系数即可。于是我们考虑对函数求偏导:

\[\begin{aligned} {\partial\over\partial x}G(x,y) &= (1+y){x\over1-x}G(x,y)\\ [x^n]{\partial\over\partial x}G(x,y) &= [x^n](1+y){x\over1-x}G(x,y)\\ (n+1)[x^{n+1}]G(x,y) &= [x^{n-1}]{1\over1-x}G(x,y)+[x^{n-1}]{y\over1-x}G(x,y)\\ (n+1)[x^{n+1}y^m]G(x,y) &= [x^{n-1}y^m]{1\over1-x}G(x,y)+[x^{n-1}y^{m-1}]{1\over1-x}G(x,y)\\ (n+1)[x^{n+1}y^m]G(x,y) &= \sum_{i=0}^{n-1}[x^{i}y^m]G(x,y)+[x^iy^{m-1}]G(x,y)\\ \end{aligned} \]

到此得到递推式,前缀和优化一下,时间复杂度 \(O(nk)\)

P7439 题解

数据范围:\(1\le n,k\le10^5\)。求一项。

貌似需要用到科技。然后去网上搜做法,看到的基本都是拉格朗日反演。然后因为笔者数学太差了没学太懂,于是就只能口胡了。然后笔者就去学习了拉反并写了一篇博客,如果不会建议先去看一下。

好了废话不多说,正片开始。

上面的思路太麻烦,我们其实可以直接枚举 \(\text{cyc}_\pi\),然后每个地方乘上系数即可。所以我们现在需要快速求 \([x^n]e^{y(-\ln(1-x)-x)}\)

现在我们需要处理的函数非常复杂,我们尝试将它拆解,然后用拉格朗日反演得到系数的关系。

因为指数太复杂所以设 \({G^2(x)\over2}=-\ln(1-x)-x\),复合逆为 \(H(x)\)。然后我们就可以进行拓展拉格朗日反演:

\[[x^n]e^{G^2(x)y\over2}={1\over n}[x^{n-1}]xye^{x^2y\over2}\left(x\over H(x)\right)^n \]

我们把 \(e^{x^2y\over2}\) 写成多项式的形式得到:

\[{1\over n}[x^{n-1}y^m]xye^{x^2y\over2}\left(x\over H(x)\right)^n={1\over n2^{m-1}(m-1)!}[x^{n-2m}]\left(x\over H(x)\right)^n \]

现在我们只用求出 \(H(x)\) 就大功告成。那么如何求呢?考虑到 \(H(x)\)\(G(x)\) 的复合逆,所以有

\[{x^2\over2}=-\ln(1-H(x))-H(x) \]

把它整理可得:

\[2H(x)+2\ln(1-H(x))+x^2=0 \]

这个就牛顿迭代即可,写出式子:

\[H(x)=H(x)-{2H(x)+2\ln(1-H(x))+x^2\over2-2(1-H(x))^{-1}} \]

这里还有一个问题,就是分母的常数项为零,所以我们需要在最开始约分约掉一个 \(x\)。最后时间复杂度 \(O(n\log^2n)\)

P7440 题解

现在要对每个 \(n\) 求:

\[\sum_iF(i)[x^ny^i]e^{y(-\ln(1-x)-x)} \]

\(G(x,y)=e^{y(-\ln(1-x)-x)}\)。此时考虑转置原理,其实我们要求:

\[\sum_iF(i)[x^i]G(x,y) \]

我们现在就需要找 \(G\) 的递推式,所以对其求偏导:

\[{\partial\over\partial x}G(x,y)={x(1+y)\over1-x}G(x,y) \]

\(G_i(y)=[x^i]G(x,y)\),现在就可以写出递推式:

\[G_i={i-1\over i}G_{i-1}+{y\over i}G_{i-2} \]

\(G_0=1\)。我们可以把递推式写成矩阵的形式:

\[\begin{bmatrix} G_i&G_{i-1} \end{bmatrix} = \begin{bmatrix} G_{i-1}&G_{i-2} \end{bmatrix} \begin{bmatrix} {i-1\over i}&1\\{y\over i}&0 \end{bmatrix} \]

设转移矩阵

\[A_i = \begin{bmatrix} {i-1\over i}&1\\{y\over i}&0 \end{bmatrix} \]

答案就是:

\[\sum_i\begin{bmatrix} F(i)&0 \end{bmatrix}\prod_{j=1}^iA_j \]

对于后面的矩阵乘法我们用分治 FFT 计算,外面的这个东西也可以分治,时间复杂度 \(O(n\log^2n+k\log^2k)\)

参考资料

指数生成函数 - OI Wiki

偏导数的定义及其计算 - 知乎

xk 的讲稿

从多项式到 Laurent 级数:Lagrange 反演入门

第二题思路参考 cmd 的题解

浅谈多项式复合和拉格朗日反演

转置原理

posted @ 2025-05-16 22:13  Lyrella  阅读(18)  评论(0)    收藏  举报