我知道数组开小了但是WA on4,观察这组数据可以发现数组爆不掉
#include<bits/stdc++.h>
#define N 1000005
#define int long long
#define mod 998244353
using namespace std;
int n,q,x,fac[N];
struct node{
int len,x[N];
}f,tmp,res;
int fpow(int x,int y){
int res=1;
while(y){
if(y&1)res=(res*x)%mod;
x=(x*x)%mod;
y>>=1;
}
return res;
}
void Mul(node &u,node v){
res.len=u.len+v.len;
for(int i=0;i<=res.len;i++)res.x[i]=0;
for(int i=0;i<=u.len;i++)
for(int j=0;j<=v.len;j++)
res.x[i+j]=(res.x[i+j]+u.x[i]*v.x[j])%mod;
u.len=res.len;
for(int i=0;i<=res.len;i++)u.x[i]=res.x[i];
}
void Del(node &u,node v){
res.len=u.len;
for(int i=0;i<=u.len;i++)res.x[i]=(u.x[i]-v.x[i]+mod)%mod;
u.len=res.len;
for(int i=0;i<=res.len;i++)u.x[i]=res.x[i];
}
void query(node &u,node v){
res.len=u.len-v.len;
for(int i=u.len;i>=v.len;i--){
int tmp=(u.x[i]*fpow(v.x[v.len],mod-2))%mod;
res.x[i-v.len]=tmp;
for(int j=v.len;j>=0;j--){
u.x[i+j-v.len]-=v.x[j]*tmp;
u.x[i+j-v.len]%=mod;
u.x[i+j-v.len]=(u.x[i+j-v.len]+mod)%mod;
}
}
u.len=res.len;
for(int i=0;i<=res.len;i++)u.x[i]=res.x[i];
}
int C(int n,int m){
int res=fac[n];
res=(res*fpow(fac[m],mod-2))%mod;
res=(res*fpow(fac[n-m],mod-2))%mod;
return res;
}
signed main(){
cin>>n>>q;
fac[0]=1;
for(int i=1;i<=n*3+3;i++)fac[i]=(fac[i-1]*i)%mod;
tmp.len=1,tmp.x[0]=tmp.x[1]=1;
for(int i=0;i<=n+n+n+3;i++)f.x[i]=C(n*3+3,i);
f.len=n*3+3;
tmp.len=3,tmp.x[0]=1,tmp.x[1]=3,tmp.x[2]=3,tmp.x[3]=1;
Del(f,tmp);
tmp.x[0]=0;
query(f,tmp);
while(q--){
scanf("%d",&x);
printf("%d\n",f.x[x]);
}
}
//(x+1)^3n