蒟蒻求助大佬,想练练NTT,结果T了
查看原帖
蒟蒻求助大佬,想练练NTT,结果T了
179253
无尽星空楼主2020/8/13 18:59
#include<bits/stdc++.h>
#define LL long long
#define R register int
using namespace std;
const int N=1000005;
LL f[N*3],g[N*3],ans[N*3],p=998244353,root=3,sz,bit,rev[N*3],powr[N*3],powinv[N*3],inv;
int n,m;
inline int read()
{
	int s=0;char c=getchar();
	while(!isdigit(c))  c=getchar();
	while(isdigit(c))  s=(s<<3)+(s<<1)+(c^48),c=getchar();
	return s;
}
LL ksm(LL a,LL k)
{
	LL rt=1;
	while(k)
	{
		if(k&1)  rt=rt*a%p;
		a=a*a%p;k>>=1;
	}
	return rt;
}
void NTT(LL *a,int iv)
{
	for(R i=0;i<sz;i++)
		if(i<rev[i])  swap(a[i],a[rev[i]]);
	for(R mid=1;(mid<<1)<=sz;mid<<=1)
	{
		LL w=(iv==1?powr[mid<<1]:powinv[mid<<1]);
		for(R i=0;i<sz;i+=(mid<<1))
		{
			LL now=1;
			for(R j=0;j<mid;j++,now=now*w%p)
			{
				LL x=a[i+j],y=now*a[i+j+mid]%p;
				a[i+j]=(x+y)%p,a[i+j+mid]=(x-y+p)%p;
			}
		}
	}
}
int main()
{
	//freopen("P3803_9.in","r",stdin);
	//freopen("me.out","w",stdout);
	n=read();m=read();
	for(R i=0;i<=n;i++)  f[i]=read();
	for(R i=0;i<=m;i++)  g[i]=read();
	for(sz=1;sz<=n+m;bit++,sz<<=1);
	for(R i=0;i<sz;i++)  rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
	inv=ksm(root,p-2);
	for(R i=1;i<=sz;i<<=1)  powr[i]=ksm(root,(p-1)/i),powinv[i]=ksm(inv,(p-1)/i);
	NTT(f,1);NTT(g,1);
	for(R i=0;i<sz;i++)  ans[i]=f[i]*g[i]%p;
	NTT(ans,-1);
	LL div=ksm(sz,p-2)%p;
	for(R i=0;i<=n+m;i++)  printf("%lld ",ans[i]*div%p);
	return 0;
}
2020/8/13 18:59
加载中...