#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define ll long long
#define pp pair<ll,ll>
#define ld long double
#define all(a) (a).begin(),(a).end()
#define mk make_pair
constexpr int inf=1000001000;
constexpr ll INF=2e18;
constexpr ll mod=1000000007;
// ll MOD=998244353;
ll MOD=998244353;

void Add(int &a, int b) {
  a += b;
  while (a >= MOD) a -= MOD;
  while (a < 0) a += MOD;
}
 
void Mul(int &a, int b) {
  a = 1LL * a * b % MOD;
}
 
int Pow(int b, int e) {
  if (e < 0) e += MOD - 1;
  int ret = 1;
  while (e) {
    if (e & 1) ret = 1LL * ret * b % MOD;
    b = 1LL * b * b % MOD;
    e >>= 1;
  }
  return ret;
}

int main() {
    int n,k;
    cin >> n >> k;
    vector<ll> a(n);
    rep(i,n) cin >> a[i];
    // vector<vector<ll>> b(n,vector<ll>(k+1,1));
    vector<ll> b(n,1);
    vector<ll> e(k+5,0);
    rep(i,k+1) e[i]=Pow(i,MOD-2);
    vector<ll> c(k+1,0);
    rep(i,n){
      rep(j,k+1){
        (c[j]+=b[i])%=MOD;
        b[i]=(b[i]*a[i]%MOD*e[j+1])%MOD;
      }
    }
    // rep(i,n){
    //   rep(j,k+1) (c[j]+=b[i][j])%=MOD;
    // }
    vector<ll> ans(k+1);
    ans[1]=1;
    rep(i,k){
      ans[i+2]=(ans[i+1]*(i+2))%MOD;
    }
    vector<ll> o(k,0);
    rep(i,k){
      rep(j,k+1){
        if (i+1-j<0) break;
        (o[i]+=c[j]*c[i+1-j]%MOD)%=MOD;
      }
    }
    vector<ll> p(k+2,0);
    ll cc;
    rep(i,n){
      cc=a[i]*2;
      rep(j,k) {
        (p[j]+=cc)%=MOD;
        (cc*=a[i]*2)%=MOD;
      }
    }
    rep(i,k) cout << ((ans[i+1]*o[i]%MOD+MOD-p[i])%MOD)*Pow(2,MOD-2)%MOD << endl;
}

#define wiwihorz
#include <bits/stdc++.h> 
#pragma GCC optimize("Ofast")
#pragma loop-opt(on)

#define rep(i, a, b) for(int i = a; i <= b; i++)
#define rrep(i, a, b) for(int i = b; i >= a; i --)
#define all(x) x.begin(), x.end()
#define ceil(a, b) ((a + b - 1) / (b))

#define MAXN 1000005
#define INF 1000000000000000000
#define MOD 998244353
#define eps (1e-9)

#define int long long int 
#define lld long double
#define pii pair<int, int>
#define random mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count())

using namespace std;
#ifdef wiwihorz
#define print(a...) kout("[" + string(#a) + "] = ", a)
void vprint(auto L, auto R) {
	while(L < R) cerr << *L << " \n"[next(L) == R], ++L;
} 
void kout() {cerr << endl;}
template<class T1, class ... T2> void kout(T1 a, T2 ... e) {
	cerr << a << " ", kout(e...);  
}
#else 
#define print(...) 0
#define vprint(...) 0
#endif
int n, m, k;
int pow_(int a, int times) {
	int ans = 1;
	for(;times > 0; times >>= 1, a = (a * a) % MOD) {
		if(times & 1) ans = (ans * a) % MOD;
	}
	return ans;
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(0);
	cin >> n >> m >> k;
	if(m == 1 || n == 1) {
		if(n < m) swap(n, m);
		int ans = 0;
		ans = pow_(k, n);
		cout << (ans % MOD + MOD) % MOD << "\n";
	}
	else {
		int ans = 0;
		rep(i, 1, k) {
			ans += (pow_(i, n) - pow_(i - 1, n)) 
				* pow_(k - i + 1, m) % MOD;
			ans %= MOD;
		}
		cout << (ans % MOD + MOD) % MOD << "\n";
	}
	return 0;
}