洛谷P4721 分治FFT

链接

分治FFT

题解

这个题一眼看上去就很像 f = f ∗ g f = f*g f=fg,当自定义 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);
}

你可能感兴趣的:(NTT)