#include <bits/stdc++.h>

#define rep(i, a, b) for (int i = (a); i <= int(b); i++)
#define per(i, a, b) for (int i = (a); i >= int(b); i--)
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define il inline
#define ct template<class type>
#define clr(a, n) memset((a), 0, sizeof((a)[0]) * (n))
#define cpy(a, b, n) memcpy((b), (a), sizeof((a)[0]) * (n))

using namespace std;

typedef long long ll;
typedef double db;
typedef pair<int, int> pii;

ct il void cmax(type &x, type y) { x < y ? x = y : 0; }
ct il void cmin(type &x, type y) { x > y ? x = y : 0; }

const int maxn = 55, maxl = 2005, mod = 998244353;

il int& red(int &x) { return x += x >> 31 & mod; }

il int qpow(int a, int b) {
	int c = 1;
	for (; b; b >>= 1, a = ll(a) * a % mod) if (b & 1) c = ll(a) * c % mod;
	return c;
}

il int sx(int s, int x) {
	return s & 1 ? red(x = -x) : x;
}

int n, K, L, l[maxn], f[maxn][maxl], g[maxn][maxl], fac[maxl], fic[maxl];

void prework(int n) {
	fac[0] = 1;
	rep(i, 1, n) fac[i] = ll(i) * fac[i - 1] % mod;
	fic[n] = qpow(fac[n], mod - 2);
	per(i, n, 1) fic[i - 1] = ll(i) * fic[i] % mod;
}

int main() {
	prework(2e3);
	scanf("%d %d", &n, &K);
	rep(i, 1, n) {
		scanf("%d", &l[i]), L += l[i];
	}
	int iL = qpow(L, mod - 2);
	f[0][0] = 1;
	int mx = 0;
	rep(i, 1, n) {
		rep(j, 0, i - 1) rep(k, 0, mx) {
			g[j][k] = f[j][k];
		}
		rep(u, 1, l[i] / K) {
			int x = ll(l[i] - u * K) * iL % mod, y = qpow(x, u);
			int p = ll(y) * sx(u, fic[u]) % mod, q = ll(p) * u % mod * qpow(x, mod - 2) % mod;
			rep(j, 0, i - 1) rep(k, 0, mx) {
				red(g[j][k + u] += ll(p) * f[j][k] % mod - mod);
				red(g[j + 1][k + u] += ll(q) * f[j][k] % mod - mod);
			}
		}
		mx += l[i] / K;
		rep(j, 0, i) rep(k, 0, mx) {
			f[j][k] = g[j][k];
		}
	}
	int ans = 0;
	rep(j, 0, n) rep(k, 1, mx) if (k - j >= 0) {
		red(ans -= ll(f[j][k]) * fac[k - j] % mod * qpow(ll(k * K) * iL % mod, mod - 2 - (k - j)) % mod);
	}
	printf("%d\n", ans);
	return 0;
}