社区讨论

初学者ntt模板求助

P3803【模板】多项式乘法(FFT)参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo29posf
此快照首次捕获于
2023/10/23 10:17
2 年前
此快照最后确认于
2023/11/03 10:30
2 年前
查看原帖
rt
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e6+10, mod=998244353, g=3;
ll n,m,a[maxn],b[maxn],c[maxn],r[maxn];
ll power(ll a,ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
void ntt(ll n,ll *a)
{
	for(ll i=0;i<(1<<n);i++)
		if(i<r[i]) swap(a[i],a[r[i]]);
	for(ll i=0;i<n;i++)
	{
		ll G=power(g,(mod-1)/(1<<i+1));
		for(ll j=0;j<(1<<n);j+=(1<<i+1))
		{
			for(ll k=0,g0=1;k<(1<<i);k++,g0=g0*G%mod)
			{
				ll a1=a[j+k], a2=a[(1<<i)+j+k], t=a2*g0%mod;
				a[j+k]=(a1+t)%mod;
				a[(1<<i)+j+k]=(a1-t+mod)%mod;
			}
		}
	}
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=0;i<=n;i++) scanf("%lld",a+i);
	for(ll i=0;i<=m;i++) scanf("%lld",b+i);
	ll s=n+m, p=0;
	while((1<<p)<=s) ++p;
	for(ll i=1;i<(1<<p);i++)
		r[i]=(r[i>>1]>>1)|((i&1)<<p-1);
	ntt(p,a);
	ntt(p,b);
	for(ll i=0;i<(1<<p);i++) c[i]=a[i]*b[i]%mod;
	ntt(p,c);
	reverse(c+1,c+(1<<p));
	ll inv=power(s+1,mod-2);
	for(ll i=0;i<=s;i++) printf("%lld ",c[i]*inv%mod);
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...