#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
#define debug(val) cerr << "The value of " << #val << " is = " << val << '\n';
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
const ld PI = 4*atan((ld)1);
const ll mod = 998244353;
const ll inf = 922337203685477;
const ll nax = 5005;

ll fac[nax], iv[nax];

ll pangkat(ll x, ll y){
	if(y == 0) return 1;
	ll temp = pangkat(x, y / 2);
	if(y & 1){
		return temp * temp % mod * x % mod;
	}
	else{
		return temp * temp % mod;
	}
}

void init(){
	fac[0] = 1;
	for(ll i = 1; i < nax; i++){
		fac[i] = fac[i-1] * i % mod;
	}
	iv[nax-1] = pangkat(fac[nax-1], mod - 2);
	for(ll i = nax - 2; i >= 0; i--){
		iv[i] = iv[i+1] * (i + 1) % mod;
	}
}

ll c(ll x, ll y){
	return fac[x] * iv[y] % mod * iv[x-y] % mod;
}

ll n, m;
ll dp[15][nax];

int main(){ 
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    init();
    cin >> n >> m;
    dp[0][0] = 1;
    for(ll mask = 1; mask <= 13; mask++){
		ll bit = (1 << (mask - 1));
		for(ll i = 0; i <= m; i++){
			for(ll j = 0; j <= n && i + j * bit <= m; j += 2){
				dp[mask][i+j*bit] += dp[mask-1][i] * c(n, j);
				dp[mask][i+j*bit] %= mod;
			}
		}
	}
	cout << dp[13][m] << '\n';
}

#include<vector>
#include<iostream>
#include<fstream>
#include<string>
#include<cassert>
#include<algorithm>
#include<random>
#include<map>
#include<set>
#include <bitset>

using namespace std;

//int mod = 998244353;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<vector<int>> vvi;
typedef vector<vector<char>> vvc;
typedef vector<vector<ll>> vvl;
typedef vector<pair<ll, ll>> vpll;
typedef vector<pair<ld, ld>> vpld;
typedef vector<pair<int, int>> vpi;
typedef pair<ld, ld> pld;
#define mp make_pair
#define pb push_back

int mod = 998244353;

int sum(int a, int b)
{
	int c = a + b;
	if (c >= mod)
	{
		c -= mod;
	}
	return c;
}

int dif(int a, int b)
{
	int c = a - b;
	if (c < 0)
	{
		c += mod;
	}
	return c;
}

int mlt(int a, int b)
{
	ll c = a * 1LL * b;
	return c % mod;
}

int ibit(int n, int i)
{
	return ((n >> i) & 1);
}

void outp1(vi &ou, string s)
{
	cout << s << endl;
	for (int i = 0; i < ou.size(); i++)
	{
		cout << ou[i] << ' ';
	}
	cout << endl;
}

void outp2(vvi &ou, string s)
{
	cout << s << endl;
	for (int i = 0; i < ou.size(); i++)
	{
		for (int j = 0; j < ou[i].size(); j++)
		{
			cout << ou[i][j] << ' ';
		}
		cout << '\n';
	}
}

int bp(int x, int y)
{
	if (y == 0)
	{
		return 1;
	}
	int a = 0;
	if (!(y % 2))
	{
		a = bp(x, y / 2);
	}
	return (y % 2) ? mlt(bp(x, y - 1), x) : mlt(a, a);
}

int obr(int x)
{
	return bp(x, mod - 2);
}

const int maxn = 312;
int fact[maxn], ofact[maxn];

void prec()
{
	fact[0] = 1;
	ofact[0] = 1;
	for (int i = 1; i < maxn; i++)
	{
		fact[i] = mlt(fact[i - 1], i);
	}
	//cerr << "sdsds" << endl;
	ofact[maxn - 1] = obr(fact[maxn - 1]);
	for (int i = maxn - 2; i > 0; i--)
	{
		ofact[i] = mlt(ofact[i + 1], i + 1);
	}
}

int c(int a, int b)
{
	return ((a <= b) && (a >= 0)) ? mlt(fact[b], mlt(ofact[a], ofact[b - a])) : 0;
}


void solve(istream &cin = std::cin, ostream &cout = std::cout)
{
	int n, k;
	cin>>n>>k;
	vector<int>pows(k+2);
	for(int i=0;i<n; i++)
	{
		int d;
		cin>>d;
		int val=1;
		for(int i=0; i<pows.size(); i++)
		{
			pows[i]=sum(val, pows[i]);
			val=mlt(val, d);
		}
	}
	//outp1(pows, " ");
	for(int i=1; i<=k; i++)
	{
		int td=0;
		for(int j=0; j<=i; j++)
		{
			int an=1;
			an=mlt(an, c(j, i));
			an=mlt(an, pows[i-j]);
			an=mlt(an, pows[j]);
			td=sum(td, an);
		}
		int bn=pows[i];
		bn=mlt(bn, bp(2,i));
		td=dif(td, bn);
		cout<<mlt(td, bp(2, mod-2))<<endl;
	}
}

int main()
{
	prec();
	solve();
	int n;
	cin >> n;
}