洛谷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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值