#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ldb double
template<typename T>void ckmn(T&a,T b){a=min(a,b);}
template<typename T>void ckmx(T&a,T b){a=max(a,b);}
void rd(int&x){scanf("%i",&x);}
void rd(ll&x){scanf("%lld",&x);}
void rd(char*x){scanf("%s",x);}
void rd(ldb&x){scanf("%lf",&x);}
void rd(string&x){scanf("%s",&x);}
template<typename T1,typename T2>void rd(pair<T1,T2>&x){rd(x.first);rd(x.second);}
template<typename T>void rd(vector<T>&x){for(T&i:x)rd(i);}
template<typename T,typename...A>void rd(T&x,A&...args){rd(x);rd(args...);}
template<typename T>void rd(){T x;rd(x);return x;}
int ri(){int x;rd(x);return x;}
template<typename T>vector<T> rv(int n){vector<T> x(n);rd(x);return x;}
template<typename T>void ra(T a[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]);}
template<typename T1,typename T2>void ra(T1 a[],T2 b[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]),rd(b[st+i]);}
template<typename T1,typename T2,typename T3>void ra(T1 a[],T2 b[],T3 c[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]),rd(b[st+i]),rd(c[st+i]);}
void re(vector<int> E[],int m,bool dir=0){for(int i=0,u,v;i<m;++i){rd(u,v);E[u].pb(v);if(!dir)E[v].pb(u);}}
template<typename T>void re(vector<pair<int,T>> E[],int m,bool dir=0){for(int i=0,u,v;i<m;++i){T w;rd(u,v,w);E[u].pb({v,w});if(!dir)E[v].pb({u,w});}}

const int mod=998244353;
int add(int a,int b){a+=b;return a>=mod?a-mod:a;}
void ckadd(int&a,int b){a=add(a,b);}
int sub(int a,int b){a-=b;return a<0?a+mod:a;}
void cksub(int&a,int b){a=sub(a,b);}
int mul(int a,int b){return (ll)a*b%mod;}
void ckmul(int&a,int b){a=mul(a,b);}
int powmod(int x,int k){int ans=1;for(;k;k>>=1,ckmul(x,x))if(k&1)ckmul(ans,x);return ans;}
int inv(int x){return powmod(x,mod-2);}

const int N=1000050;
int F[N],I[N];
int binom(int n, int k){ return mul(F[n],mul(I[k],I[n-k]));}
void calc()
{
	F[0]=1;
	for(int i=1;i<N;i++) F[i]=mul(F[i-1],i);
	I[N-1]=inv(F[N-1]);
	for(int i=N-2;~i;i--) I[i]=mul(I[i+1],i+1);
}

int go[N];

int main(){
	calc();
	int n,m;
	rd(n,m);
	for(int i=2;i<=m;i++){
		if(!go[i]){
			for(int j=i;j<=m;j+=i)go[j]=i;
		}
	}
	int ans=0;
	for(int last=1;last<=m;last++){
		vector<pii> fact;
		for(int i=last;i>1;i/=go[i]){
			if(fact.empty()||fact.back().first!=go[i]){
				fact.pb({go[i],1});
			}else fact.back().second++;
		}
		int sol=1;
		for(auto it:fact){
			ckmul(sol,binom(it.second+n-1,it.second));
		}
		ckadd(ans,sol);
	}
	printf("%i\n",ans);
	return 0;
}

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define mp make_pair
#define pb push_back

#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#define rep(i, n) for (int i = 0; i < (int)(n); ++ i)

int main() {
	const int mod = 998244353, i2 = 499122177;
	int n, k;
	scanf("%d %d", &n, &k);
	vector <int> a(n);
	rep(i, n) scanf("%d", &a[i]);
	vector <int> sum(k + 1), sum2(k + 1);
	rep(i, n) {
		int e = 1, e2 = 1;
		rep(j, k + 1) {
			sum[j] += e;
			if (sum[j] >= mod) sum[j] -= mod;
			sum2[j] += e2;
			if (sum2[j] >= mod) sum2[j] -= mod;
			e = 1LL * e * a[i] % mod;
			e2 = 1LL * e2 * (a[i] * 2) % mod;
		}
	}
	vector <vector <int> > C(k + 1, vector <int> (k + 1));
	rep(i, k + 1) rep(j, i + 1) C[i][j] = j ? (C[i - 1][j - 1] + C[i - 1][j]) % mod : 1;
	vector <int> ans(k + 1);
	for (int x = 1; x <= k; ++ x) {
		for (int y = 0; y <= x; ++ y)
			(ans[x] += 1LL * C[x][y] * sum[y] % mod * sum[x - y] % mod) %= mod;
		(ans[x] += mod - sum2[x]) %= mod;
		ans[x] = 1LL * ans[x] * i2 % mod;
		printf("%d\n", ans[x]);
	}
	return 0;
}
