链接
题解
这个题一眼看上去就很像 f = f ∗ g f = f*g f=f∗g,当自定义 g [ 0 ] = 0 g[0] = 0 g[0]=0的时候,题目中给出的 f f f与这个卷积就只有常数项不同,因此考虑计算这个卷积。由于 f f f的系数未知,因此不能直接卷积,如果逐项求,每次做一遍卷积那样时间上承受不了。考虑分治,思路和 C D Q CDQ CDQ一样,先递归计算低次项,再计算低次项对高次项的影响,再递归计算高次项。低次项对高次项的影响卷积即可。
代码
void CDQ_NTT(LL *f, LL *g, int l, int r)
{
if (l == r)
{
if (!l)
f[l] = 1;
return;
}
int mid = (l + r) >> 1;
CDQ_NTT(f, g, l, mid);
poly.Multiply(f + l, mid - l + 1, g, r - l + 1, ans);
for (int i = mid + 1; i <= r; ++i)
(f[i] += ans[i - l]) %= mod;
CDQ_NTT(f, g, mid + 1, r);
}