把 ntt 放到 struct 里直接 TLE 了,不放进去最后一个点 400ms
#include<bits/stdc++.h>
// #pragma GCC optimize ("O2")
#define int long long
#define For(i,a,b) for(i=a;i<=b;i++)
#define FOR(i,a,b) for(i=a;i>=b;i--)
#define pb push_back
using namespace std;
const int N=4e6+10;
int a[N],b[N],g[N];
struct Poly{
int mod=998244353,G=3,inv_G=332748118;
int rev[N];
int qz(int x,int y){
int res=1;
for(;y;y>>=1){
if(y&1) res=res*x%mod;
x=x*x%mod;
}
return res;
}
void ntt(int a[],int sign,int tot){
int i,j,mid;
For(i,0,tot-1) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(mid=1;mid<tot;mid<<=1){
auto g1=qz(G,(mod-1)/(mid<<1));
if(sign==-1) g1=qz(inv_G,(mod-1)/(mid<<1));
for(i=0;i<tot;i+=(mid<<1)){
auto gk=1;
for(j=0;j<mid;j++,gk=gk*g1%mod){
auto x=a[i+j],y=gk*a[i+j+mid]%mod;
a[i+j]=(x+y)%mod,a[i+j+mid]=(x-y+mod)%mod;
}
}
}
int inv=qz(tot,mod-2);
if(sign==-1) For(i,0,tot-1) a[i]=a[i]*inv%mod;
}
void mul(int a[],int n,int b[],int m,int c[]){
int i,tot=0,bit=0;
while((1<<bit)<=n+m) bit++;
tot=1<<bit;
For(i,0,tot-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
ntt(a,1,tot),ntt(b,1,tot);
For(i,0,tot-1) c[i]=a[i]*b[i]%mod;
ntt(c,-1,tot);
}
}ntt;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m,i;
cin>>n>>m;
For(i,0,n) cin>>a[i];
For(i,0,m) cin>>b[i];
ntt.mul(a,n,b,m,g);
For(i,0,n+m) cout<<g[i]<<' ';
return 0;
}