cdqNTT


分治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);
}

文章作者: fatzard
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fatzard !
评论
  目录
本站总访问量