#include <bits/stdc++.h>
#define rep(i, L, R) for (int i = (L); i <= (R); ++i)
const int MOD = 998244353;
inline int add(int x, int y) { return x + y >= MOD ? x + y - MOD : x + y; }
inline int sub(int x, int y) { return x < y ? x - y + MOD : x - y; }
inline int mul(int x, int y) { return 1LL * x * y - 1LL * x * y / MOD * MOD; }
inline int Qpow(int a, int b) { int ans = 1; for (; b; a = mul(a, a), b >>= 1) if (b & 1) ans = mul(ans, a); return ans; }
inline int inv(int x) { return Qpow(x, MOD - 2); }
int n, S, T;
int a[410], b[410], P[410][410], tmpP[410][410], iv[410];
int main() {
iv[1] = 1;
for (int i = 2; i <= 405; ++i) iv[i] = mul(iv[MOD % i], MOD - MOD / i);
scanf("%d", &n);
rep(i, 1, n) scanf("%d%d", a + i, b + i), S += a[i], T += b[i] - 1;
int invS = inv(S);
P[0][0] = 1;
rep(i, 1, n) {
rep(j, 0, S) rep(k, 0, T) tmpP[j][k] = P[j][k], P[j][k] = 0;
rep(j, 0, S) rep(k, 0, T) for (int l = 0, pro = 1; l < b[i] && l <= k; ++l, pro = mul(pro, mul(a[i], mul(invS, iv[l])))) P[j][k] = sub(P[j][k], mul(pro, tmpP[j][k - l]));
rep(j, a[i], S) rep(k, 0, T) P[j][k] = add(P[j][k], tmpP[j - a[i]][k]);
}
int ans = 0;
for (int i = 0; i < S; ++i) {
int x = mul(i, invS), invX = inv(sub(1, x));
for (int j = 0, pro = invX; j <= T; ++j, pro = mul(pro, mul(j, invX))) ans = add(ans, mul(P[i][j], pro));
}
printf("%d\n", sub(0, ans));
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:17:7: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
17 | scanf("%d", &n);
| ~~~~~^~~~~~~~~~
./Main.cpp:18:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
18 | rep(i, 1, n) scanf("%d%d", a + i, b + i), S += a[i], T += b[i] - 1;
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~