多项式学习记录

分治 FFT

LuoguP4721

考虑分治。

\[f[i]=\sum\sum_{j=l}^{mid}f[i]\times g[i-j] \]

防止 \(l\) 前的元素的干扰,截取后一部分做卷积。

时间复杂度 \(\Theta (nlog^2n)\)

void solve(int l, int r) {
  if (l == r) 
    return;
  int mid = (l + r) >> 1;
  solve(l, mid);
  for (int i = 0; i <= r - l; i++)
    A[i] = B[i] = 0; 
  for (int i = 0; i <= mid - l; ++i)
    A[i] = f[i + l];
  for (int i = 0; i <= r - l; ++i)
    B[i] = g[i];
  DFT(A, r - l + 1), DFT(B, r - l + 1);
  for (int i = 0; i <= r - l; ++i)
    A[i] = (ll)A[i] * B[i] % mod;
  IDFT(A, r - l + 1);
  for (int i = mid + 1; i <= r; ++i)
    f[i] = (f[i] + A[i - l]) % mod; 
  solve(mid + 1, r);
}

猜你喜欢

转载自www.cnblogs.com/chhokmah/p/12642306.html
今日推荐