/*Lucky_Glass*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 55, L = 2005, MOD = 998244353;
#define con(type) const type &

inline int add(con(int) a, con(int) b) {
	return a + b >= MOD ? a + b - MOD : a + b;
}
inline int sub(con(int) a, con(int) b) {
	return a - b < 0 ? a - b + MOD : a - b;
}
inline int mul(con(int) a, con(int) b) {
	return int(1ll * a * b % MOD);
}
inline int inaPow(con(int) a, con(int) b) {
	return b ? mul(inaPow(mul(a, a), b >> 1), (b & 1) ? a : 1) : 1;
}

int n, vk, totl, curi, curj;
int arl[N], f[L][N], g[L][N], fac[L], ifac[L];

void dp(int l) {
	const int IVL = inaPow(totl, MOD - 2);
	for (int i = curi + l; ~i; i--)
		for (int j = curj + 1; ~j; j--)
			f[i][j] = 0;
	int u = l / vk;
	for (int t = 0; t <= u; t++) {
		int t1 = mul(inaPow(mul(l - vk * t, IVL), t), ifac[t]),
			t2 = mul(inaPow(mul(l - vk * (t + 1), IVL), t), ifac[t]);
		if ( t & 1 ) t1 = sub(0, t1), t2 = sub(0, t2);
		for (int i = 0; i <= curi; i++)
			for (int j = 0; j <= curj; j++) {
				f[i + t][j] = add(f[i + t][j], mul(g[i][j], t1));
				if ( t < u )
					f[i + t][j + 1] = sub(f[i + t][j + 1], mul(g[i][j], t2));
			}
	}
	curi += l, curj++;
}
void init() {
	fac[0] = 1;
	for (int i = 1; i < L; i++) fac[i] = mul(fac[i - 1], i);
	ifac[L - 1] = inaPow(fac[L - 1], MOD - 2);
	for (int i = L - 2; ~i; i--) ifac[i] = mul(ifac[i + 1], i + 1);
}
int main() {
	init();
	scanf("%d%d", &n, &vk);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &arl[i]);
		totl += arl[i];
	}
	f[0][0] = 1;
	for (int i = 1; i <= n; i++) {
		if ( arl[i] <= vk ) continue;
		swap(f, g);
		dp(arl[i]);
	}
//	printf("%d\n", f[0][0]);
	int t2 = mul(inaPow(totl, MOD - 2), vk), ans = 0;
	for (int i = 0; i <= curi; i++)
		for (int j = 0; j <= curj; j++) {
			int t1 = inaPow(inaPow(mul(i + j, t2), i + 1), MOD - 2);
//			printf("? %d\n", t1);
			ans = sub(ans, mul(mul(f[i][j], fac[i]), t1));
		}
	printf("%d\n", ans);
	return 0;
}
