下降幂多项式和 [ATC ARC118F] Growth Rate

2022/3/11 23:20:44

本文主要是介绍下降幂多项式和 [ATC ARC118F] Growth Rate,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

[ATC ARC118F] Growth Rate

​ 老题新做。

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

\[x^n = \sum_{i = 0}^n x^\underline i {n \brace i} \\ x^\underline n = \sum_{i = 0} (-1)^{n-i} {n \brack i} x^i \]

Part I - 常规做法

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

  • \(a_i = 1\),\(\displaystyle F_{i+1}(x) = \sum_{y \leq x} F_i(y)\)
  • \(a_i > 1\),\(\displaystyle F_{i+1}(x) = \sum_{a_iy \leq x}F_i(y)\)

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

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

  • \(a_i = 1\),\(\displaystyle F_{i - 1}(x) = \sum_{y = x}^m F_i(x)\)
  • \(a_i > 1\),\(\displaystyle F_{i - 1}(x) = \sum_{y \geq ax}^m F_i(y)\)

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

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

​ 有一个常数比较小的做法。考虑维护这个多项式的下降幂形式:令 \(\displaystyle F_i(x) = \sum_{j = 0}^n f_{i, j}x^{\underline{j}}\)。

​ 考虑 \(G(y) = \sum_{x < y} F(x)\) 操作:

\[\begin{aligned} G(y) &= \sum_{x = 0}^{y-1} F(x) \\ \sum_{i = 0}^n g_i y^\underline i &= \sum_{x = 0}^{y-1} \sum_{i = 0}^n f_i x^\underline i \\ \sum_{i = 0}^n g_i y^\underline i &= \sum_{i=0}^n f_i \sum_{x = 0}^{y-1} i!\binom{x}{i} \\ \sum_{i = 0}^n g_i y^\underline i &= \sum_{i=0}^n i!f_i \binom{y}{i + 1} \\ \sum_{i = 0}^n g_i y^\underline i &= \sum_{i=0}^n i!f_i \frac{y^\underline{i+1}}{(i+1)!} \\ \sum_{i = 0}^n g_i y^\underline i &= \sum_{i=0}^n \frac{1}{i+1} f_i y^\underline{i+1} \end{aligned} \]

​ 这样就可以线性了。

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

\[\begin{aligned} G(x) &= F(ax) \\ \sum_{i = 0}^n g_i x^\underline i &= \sum_{i = 0}^n f_i (ax)^\underline i \\ \sum_{j = 0}^n x^j \sum_{i = 0}^n (-1)^{i-j} {i \brack j} g_i &= \sum_{j = 0}^n a^jx^j \sum_{i = 0}^n (-1)^{i-j} {i \brack j} f_i \\ \forall j, \sum_{i = j}^n (-1)^{i-j} {i \brack j} g_i &= a^j \sum_{i = j}^n (-1)^{i-j} {i \brack j} f_i \end{aligned} \]

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

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

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

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

\[\begin{aligned} \sum_{i \geq 0} \frac{F(i)x^i}{i!} &= \sum_{i \geq 0} \frac{x^i}{i!}\sum_{j = 0}^n f_j i^\underline j \\ &= \sum_{i \geq 0} \frac{x^i}{i!}\sum_{j = 0}^n f_j \frac{i!}{(i-j)!} \\ &= \sum_{i \geq 0} \frac{x^i}{i!}\sum_{j = 0}^n f_j \frac{i!}{(i-j)!} \\ &= \sum_{i \geq 0} \sum_{j = 0}^n f_j \frac{x^i}{(i-j)!} \\ &= \sum_{i \geq 0} \sum_{j = 0}^n f_jx^j \frac{x^{i-j}}{(i-j)!} \\ \end{aligned} \]

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

​ 点值的 EGF 和 \(e^{-x}\)(直接展开不需要多项式求逆)卷积就能得到 \(F(x)\)。

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

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



这篇关于下降幂多项式和 [ATC ARC118F] Growth Rate的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程