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;
  }
}
posted @ 2026-09-12 17:43  nullpt3  阅读(22)  评论(2)    收藏  举报