//没什么好说的。。。。。。。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#define ll long long
#define maxn 500005
#define P 998244353
#define inv2 (P+1)>>1
#define g 3
using namespace std;
int n,m;
int A[maxn],B[maxn],C[maxn] ;
inline int add(int a,int b){
a+=b;
return a>=P?a-P:a;
}
inline int sub(int a,int b){
a-=b;
return a<0?a+P:a;
}
inline int mul(int a,int b){
return 1ll*a*b%P;
}
inline int ksm(int a,int b){
int ans=1;
while(b){
if(b&1)ans=mul(ans,a);
a=mul(a,a);
b>>=1;
}
return ans;
}
int wi[maxn];
inline void NTT(int *p,int n,int tt){
int i,j,k,m,t0,t1;
for(i=j=0;i<=n;++i){
if(i<j)swap(p[i],p[j]);
for(k=n>>1;(j^=k)<k;k>>=1);//*****
}
wi[0]=1;
for(m=1;m<n;m<<=1){
t0=ksm(g,(P-1+tt*(P-1)/(m<<1)));
for(i=1;i<m;++i)wi[i]=mul(wi[i-1],t0);
for(i=0;i<n;i+=(m<<1)){
for(j=0;j<m;++j){
t0=p[i+j];
t1=mul(p[i+j+m],wi[j]);//,cout<<wi[j]<<"--"<<endl;
p[i+j]=add(t0,t1);
p[i+j+m]=sub(t0,t1);
}
}
}
if(tt==-1){
t0=ksm(n,P-2);
for(i=0;i<n;++i){
p[i]=mul(p[i],t0);
}
}
}
int inv_tmp[maxn];
inline void poly_inv(int *A,int *B,int n){
if(n==1){
B[0]=ksm(A[0],P-2);
return;
}
poly_inv(A,B,n>>1);
fill(B+(n>>1),B+(n<<1),0);
copy(A,A+n,inv_tmp);
fill(inv_tmp+n,inv_tmp+(n<<1),0);
NTT(inv_tmp,n<<1,1);
NTT(B,n<<1,1);
for(int i=0;i<(n<<1);++i){
B[i]=mul(B[i],sub(2,mul(inv_tmp[i],B[i])));
}
NTT(B,n<<1,-1);
}
int sqrt_a[maxn],sqrt_b[maxn];
inline void poly_sqrt(int *A,int *B,int n){
if(n==1){
B[0]=1;
return;
}
poly_sqrt(A,B,n>>1);
fill(B+(n>>1),B+(n<<1),0);
copy(A,A+n,sqrt_a);
fill(sqrt_a+n,sqrt_a+(n<<1),0);
poly_inv(B,sqrt_b,n);
fill(sqrt_b+n,sqrt_b+(n<<1),0);
NTT(sqrt_a,n<<1,1);
NTT(sqrt_b,n<<1,1);
NTT(B,n<<1,1);
for(int i=0;i<(n<<1);++i){
B[i]=mul(inv2,add(B[i],mul(sqrt_a[i],sqrt_b[i])));
}
NTT(B,n<<1,-1);
}
int main(){
scanf("%d%d",&n,&m);
int tt;
for(int i=1;i<=n;++i){
scanf("%d",&tt);
C[tt]=P-4;
}
C[0]=1;
int kk=1;
while(kk<=m){
kk<<=1;
}
poly_sqrt(C,B,kk);
B[0]=(B[0]+1)%P;
poly_inv(B,A,kk);
for(int i=1;i<=m;++i){
printf("%d
",mul(A[i],2));
}
return 0;
}