我们熟知一个度数为 \(D\) 的多项式有三种经典表示:
-
系数表示,也就是 \(P(x) = \sum_{i=0}^D\limits c_i x^i\)。
-
点值表示,也即给出 \(P\) 在 \(D+1\) 个不同的位置的取值 \((x_0, P(x_0)), \dots, (x_D, P(x_D))\).
-
下降幂表示,也即定义 \(x^{\underline{i}} = x(x-1)\dots (x-i+1)\),那么可以把 \(P\) 写为 \(P(x) = \sum_{i=0}^D\limits b_i x^{\underline{i}}\).
由 (1) 和 (2) 相互转化可以使用多项式的多点求值和快速插值。
在点值表示中,如果我们的取值点是经典的前 \(D+1\) 个非负整数,也即 \(P(0),\dots,P(D)\),那么可以借助二项式反演和 \(FFT\),以 \(O(D\log D)\) 的时间在 (2) 和 (3) 之间转化。
第一类斯特林数
我们考虑从 (3) 转化为 (1)。为此我们考虑对任意 \(i\ge 0\),把 \(x^{\underline{i}}\) 写成一个 \(i\) 次多项式:
\[x^{\underline{i}} = x (x-1)\dots (x-i+1) = \sum_{j=0}^i s(i,j)\cdot x^j, \]其中 \(s(i,j)\) 是我们希望求出的系数。我们可以通过递推来求出 \(s(i,j)\):
\[s(i,j) = [x^j]x^{\underline{i}} = [x^j] (x^{\underline{i-1}}\cdot (x-(i-1))) = s(i-1,j-1) - (i-1)\cdot s(i-1,j), \]时间复杂度为 \(O(n^2)\). 得到 \(s(\star, \star)\) 之后,我们可以在 \(O(n^2)\) 的时间内完成由 (1) 和 (3) 之间的相互转化。
这里的 \(s(i,j)\) 就是(有符号)第一类斯特林数。
定义 (有符号第一类斯特林数). 对任意 \(i,j\ge 0\),定义 \(s(i,j)\) 为 \(x^{\underline{i}}\) 展开之后 \(x^j\) 一项的系数。
类似地,考虑上升幂 \(x^{\overline{i}}=x(x+1)\dots (x+i-1)\) 展开后得到的的多项式 \(x^{\overline{i}} = \sum_{j=0}^{i}\limits s_u(i,j) x^j\)
\[s_u(i,j)=[x^j]x^{\overline{i}}=[x^j](x^{\overline{i-1}}\cdot(x+i-1)) \\ =s(i-1,j-1)+(i-1)\cdot s(i-1,j) \]定义 (无符号第一类斯特林数). 对任意 \(i,j\ge 0\),定义 \(s_u(i,j)\) 为 \(x^{\overline{i}}\) 展开后 \(x_j\) 一项的系数。