Bostan-Mori、Power Projection 杂记
ABC 还是太超前了。
我们考虑引入这样一个问题,给定两个不超过 \(n\) 次的多项式 \(P(x),Q(x)\),我们需要求:
\[[x^m]\frac{P(x)}{Q(x)}
\]
其中 \(m\) 很大。我们考虑给分式上下同时乘上 \(Q(-x)\),那么有:
\[\begin{align*}
[x^m]\frac{P(x)}{Q(x)} &= [x^m]\frac{P(x)Q(-x)}{Q(x)Q(-x)} \\
&= [x^m] \frac{P_0(x^2) + xP_1(x^2)}{Q'(x^2)}
\end{align*}
\]
那么此时 \(m\) 一定对应了 \(P_0(x^2), xP_1(x^2)\) 其中一项,我们选择那一项然后递归下去算即可,每次规模会折半。而当 \(m=0\) 的时候的问题是一个多项式求逆。时间复杂度 \(O(M(n) \log m)\),这里 \(M(n)\) 指一次多项式乘法的复杂度。这个就是 Bostan-Mori 算法。
我们考虑再引入一个问题,给定一个不超过 \(n\) 次的多项式 \(F(x)\),我们想要对于每一个 \(0 \le i \le n\),求出以下值:
\[[x^n]F^i(x)
\]
考虑添加一个辅助元 \(y\),然后我们要求的就是:
\[\begin{align*}
[x^ny^i] \sum_{i=0}^{\infty} F^i(x)y^i = [x^ny^i] \frac{1}{1-F(x)y}
\end{align*}
\]
我们考虑把这个多项式拿去做 Bostan-Mori 算法:
\[\begin{align*}
[x^ny^i] \frac{P(x,y)}{Q(x,y)} &= [x^ny^i]\frac{P(x,y)Q(-x,y)}{Q(x,y)Q(-x,y)} \\
&= [x^ny^i] \frac{P_0(x^2,y) + xP_1(x^2,y)}{Q'(x^2,y)} \\
\end{align*}
\]
注意到我们每次进行递归,\(x\) 项次数的会减半,而 \(y\) 项的次数会增半,总次数还是 \(n\),时间复杂度 \(O(M(n) \log n)\)。
例:ABC436G。
模拟赛考到了这个东西,但是给了一个不太超纲的做法,可以直接分块做到 \(O(M(n)\sqrt n)\)。
贺了个代码,卷积是 \(O(n^2)\) 暴力实现的:
fv BostanMori() {
i32 N = n, M = 1;
rep (i, 0, N) rep (j, 0, M) P[i][j] = Q[i][j] = 0;
P[0][0] = Q[0][0] = 1;
rep (i, 1, n) dec(Q[i][1], ifac[i * m - 1]);
while (N) {
rep (i, 0, N) rep (j, 0, M) R[i][j] = ((i & 1) ? mod - Q[i][j] : Q[i][j]);
rep (i, 0, N) rep (j, 0, (M << 1)) {
F[i][j] = G[i][j] = 0;
rep (x, 0, i) rep (y, max<i32>(0, j - M), min<i32>(j, M)) {
inc(F[i][j], (u64)P[x][y] * R[i - x][j - y] % mod);
inc(G[i][j], (u64)Q[x][y] * R[i - x][j - y] % mod);
}
}
M <<= 1;
rep (i, 0, (N >> 1)) rep (j, 0, M) P[i][j] = F[i << 1 | (N & 1)][j], Q[i][j] = G[i << 1][j];
N >>= 1;
}
}

浙公网安备 33010602011771号