分治NTT
引出问题:
看到这个递推式,第一眼一定是暴力,但是我们会发现,暴力的时间复杂度为$O(n^2)$,显而易见时间复杂度太高
那么这个时候,我们不妨考虑CDQ分治
所以我们可以通过NTT将卷积的部分给计算出来,然后将相应的部分加上去便可以得到最后的答案。
计算一下时间复杂度:
由于我们是分治再套上NTT求卷积因此,时间复杂度为:$O(nlog^2n)$
分治NTT模版
Poly f,g;//封装的多项式
// CDQ分治,先求出f[l,mid),可以发现这部分对区间的f[mid,r)的贡献是f[l,mid)∗g[0,r−l)
void cdqntt(int l, int r)
{
if (l == r)
{
、、、、、、、
return;
}
int mid = (l + r) >> 1;
cdqntt(l, mid);
f.a.clear(), g.a.clear();
for (int i = l; i <= mid; i++)
{
f.a.push_back(F[i]);
}
for (int i = 0; i <= r - l; i++)
{
if (i == 0)
{
g.a.push_back(0);
}
else
{
g.a.push_back(G[i]);
}
}
Poly fA = (Poly)f * g;//多项式NTT计算
for (int i = mid + 1; i <= r; i++)
{
//计算贡献
}
cdqntt(mid + 1, r);
}