#include <bits/stdc++.h>

const int MAXN = 410;
const int mod = 998244353;
typedef long long LL;
void reduce(int & x) { x += x >> 31 & mod; }
int mul(int a, int b) { return (LL) a * b % mod; }
int pow(int a, int b, int res = 1) {
	for (; b; b >>= 1, a = mul(a, a)) if (b & 1) res = mul(res, a);
	return res;
}
int UP = 1, DU;
class poly {
	int A[MAXN];
public:
	int & operator [] (int x) { return A[x]; }
	int operator [] (int x) const { return A[x]; }
	int gethi() const {
		int hi = UP;
		while (hi && !A[hi - 1]) --hi;
		return hi;
	}
	poly & operator () (const poly & a, const poly & b) {
		int ha = a.gethi(), hb = b.gethi();
		for (int i = 0; i != ha; ++i) if (a[i])
			for (int j = 0; j != hb; ++j)
				reduce(A[i + j] += (LL) a[i] * b[j] % mod - mod);
		return *this;
	}
} A, B, f[MAXN], g[MAXN];
int fac[MAXN], inv[MAXN];
int xs[MAXN], ys[MAXN];
int main() {
	std::ios_base::sync_with_stdio(false), std::cin.tie(0);
	fac[0] = fac[1] = inv[0] = inv[1] = 1;
	for (int i = 2; i != MAXN; ++i) {
		fac[i] = mul(fac[i - 1], i);
		inv[i] = mul(inv[mod % i], mod - mod / i);
	}
	for (int i = 2; i != MAXN; ++i) inv[i] = mul(inv[i - 1], inv[i]);
	f[0][0] = 1;
	int n; std::cin >> n;
	for (int i = 1; i <= n; ++i)
		std::cin >> xs[i] >> ys[i], UP += ys[i] - 1, DU += xs[i];
	for (int i = 1; i <= n; ++i) {
		memset(&A, 0, sizeof A); memset(&B, 0, sizeof B);
		A[ys[i] - 1] = pow(xs[i], ys[i], inv[ys[i] - 1]);
		for (int j = 0; j < ys[i]; ++j)
			B[j] = pow(xs[i], j, (mod - inv[j]) % mod);
		for (int j = DU - xs[i]; j >= 0; --j)
			if (f[j].gethi() || g[j].gethi()) {
				f[j + xs[i]](f[j], B);
				g[j + xs[i]](f[j], A);
				g[j + xs[i]](g[j], B);
			}
	}
	int ans = 0;
	for (int i = 1; i <= DU; ++i)
		for (int j = 0; j < UP; ++j) {
			int t = pow(pow(i, j + 2), mod - 2, fac[j + 1]);
			reduce(ans += (LL) t * g[i][j] % mod - mod);
		}
	ans = mul(ans, DU);
	std::cout << ans << std::endl;
	return 0;
}
