下降幂多项式和一道题目

[ATC ARC118F] Growth Rate

​ 老题新做。

​ 所有的一切首先依赖这些式子:

xn=i=0nxi_{ni}xn_=i=0(1)ni[ni]xi

Part I - 常规做法

​ 考虑 Fi(x) 表示第 i 个数是 x 的方案数。非常容易注意到不为 1ai 只有 logV 个。dp 的转移分为两种情形:

  • ai=1Fi+1(x)=yxFi(y)
  • ai>1Fi+1(x)=aiyxFi(y)

​ 这里出现了一个很严重的问题,即我们注意操作二是对一个新的多项式 G(ax)=F(x) 点值前缀和的结果,但是 G(ax)=F(x) 这样一个多项式求出来之后其实不能满足不是 a 的倍数的位置都是 0 这个条件,所以事实上你要求的那个真正只有 a 的倍数有值的函数,它不是一个多项式。

​ 现在我们考虑把这个序列反过来。dp 的转移分为两种情形:

  • ai=1Fi1(x)=y=xmFi(x)
  • ai>1Fi1(x)=yaxmFi(y)

​ 这样 F(x) 就是一个多项式,并且 F(x) 的次数是 O(n) 的。为此我们维护 n 个点值,对后缀和操作我们用 [1,m] 的全部的和减去前缀和,这样需要先做一遍前缀和再求 m 处的点值。对于另一个操作,因为次数不多,考虑拉格朗日插值。这样复杂度是 O(n2logV),常数比较大。用多项式快速插值可以优化到 O(nlogVlog2n+n2),但感觉很没意思。

Part II - 下降幂和通常幂相互转化的做法

​ 有一个常数比较小的做法。考虑维护这个多项式的下降幂形式:令 Fi(x)=j=0nfi,jxj_

​ 考虑 G(y)=x<yF(x) 操作:

G(y)=x=0y1F(x)i=0ngiyi_=x=0y1i=0nfixi_i=0ngiyi_=i=0nfix=0y1i!(xi)i=0ngiyi_=i=0ni!fi(yi+1)i=0ngiyi_=i=0ni!fiyi+1_(i+1)!i=0ngiyi_=i=0n1i+1fiyi+1_

​ 这样就可以线性了。

​ 再考虑另一个操作,我们先做后缀和,然后搞一个 G(x)=F(ax),就可以了:

G(x)=F(ax)i=0ngixi_=i=0nfi(ax)i_j=0nxji=0n(1)ij[ij]gi=j=0najxji=0n(1)ij[ij]fij,i=jn(1)ij[ij]gi=aji=jn(1)ij[ij]fi

​ 这个每个 j 的方程都是关于 g 的一个后缀,倒着一个一个解出来就行了。

​ 这个做法的本质是下降幂多项式对后缀和处理非常有力,而普通幂多项式对 xax 非常有力;然而后缀和的次数要比普通幂多,所以我们让下降幂多项式成为我们大多数时候维护的东西,只有在遇到 xax 的时候,才把下降幂多项式转成普通幂多项式。上面这个推导过程省略了下降幂转通常幂再转回来的完整过程,而是用解系数的方法手动推导了它。下降幂转通常幂的复杂度是 O(n2) 的。

Part III - 利用下降幂多项式点值的性质获得另一个做法

​ 下降幂多项式的点值有一些神秘的性质。

i0F(i)xii!=i0xii!j=0nfjij_=i0xii!j=0nfji!(ij)!=i0xii!j=0nfji!(ij)!=i0j=0nfjxi(ij)!=i0j=0nfjxjxij(ij)!

​ 所以我们将 F(x)ex 卷积就能得到点值的 EGF,从而得到点值。

​ 点值的 EGF 和 ex(直接展开不需要多项式求逆)卷积就能得到 F(x)

​ 所以两个下降幂多项式卷积只需要先转成点值再插回去,这中间只要用到多项式乘法。

​ 我们回过头来看第一个操作,如果把点值看成一个多项式,那其实是和 11x 卷积(前缀和),得到新的点值再插回去。所以我们可以一直维护点值,然后在要前缀和的时候一直前缀和(线性);要插值(只有 logV 次)的时候和 ex 相乘。这样我们每次还需要知道 m 处的点值,这个用拉格朗日插值是 O(n) 的。

posted @   Mackerel_Pike  阅读(228)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示