分治 FFT
考虑分治。
\[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);
}