RT,用时是我写的 FFT 的三倍了。但完全看不出来相比题解代码慢在哪里 >_<
有没有神仙帮忙看看 qaq
#include<bits/stdc++.h>
#define il inline
using namespace std;
il int read()
{
int xr=0,F=1; char cr;
while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
const int N=4e6+5,mod=998244353;
il int qpow(int n,int k=mod-2)
{
int res=1;
for(;k;n=1ll*n*n%mod,k>>=1) if(k&1) res=1ll*res*n%mod;
return res;
}
int n,m,a[N],b[N],inv=qpow(3),limit=1,to[N];
il void NTT(int *a,int tp)
{
for(int i=0;i<limit;i++) if(i<to[i]) swap(a[i],a[to[i]]);
for(int len=1;len<limit;len<<=1)
{
int Wn=qpow(tp>0?3:inv,(mod-1)/(len<<1));
for(int i=0;i<limit;i+=(len<<1))
for(int j=0,w=1;j<len;j++,w=1ll*w*Wn%mod)
{
int x=a[i+j],y=1ll*w*a[i+len+j]%mod;
a[i+j]=(x+y)%mod,a[i+len+j]=(x-y+mod)%mod;
}
}
}
signed main()
{
n=read(),m=read();
for(int i=0;i<=n;i++) a[i]=read();
for(int i=0;i<=m;i++) b[i]=read();
int k=0; while(limit<=m+n) limit<<=1,k++;
for(int i=0;i<limit;i++) to[i]=(to[i>>1]>>1)|((i&1)<<(k-1));
NTT(a,1),NTT(b,1);
for(int i=0;i<limit;i++) a[i]=1ll*a[i]*b[i]%mod;
NTT(a,-1);
for(int i=0;i<=n+m;i++) printf("%lld ",1ll*a[i]*qpow(limit)%mod);
return 0;
}