#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define FILL(a, n, x) memset((a), (x), sizeof ((a)[0]) * (n))
#define COPY(a, n, b) memcpy((b), (a), sizeof ((a)[0]) * (n))
using namespace std;

const int mod = 998244353;
typedef long long li;

inline int Add(int x) { return x >= mod ? x - mod : x; }
inline void Add(int &x, int y) { x += y; if (x >= mod) x -= mod; }
inline int Sub(int x) { return x < 0 ? x + mod : x; }
inline void Sub(int &x, int y) { x -= y; if (x < 0) x += mod; }
inline int Mul(int x, int y) { return (int)((li)x * y % mod); }
inline int Mul(int x, int y, int z) { return Mul(x, Mul(y, z)); }

int Pow(int x, int y) {
  int z = 1;
  for (; y; y >>= 1) {
    if (y & 1) z = Mul(z, x);
    x = Mul(x, x);
  }
  return z;
}

int Inv(int x) {
  return Pow(x, mod - 2);
}

// ----------------------------------------

const int maxn = 400;

int n, A[maxn], B[maxn], SA, SB;
int f[maxn + 1][maxn + 1], f2[maxn + 1][maxn + 1];
int fact[maxn + 1], ifact[maxn + 1], pow[maxn + 1];

void InitFact(int n) {
  fact[0] = 1;
  for (int i = 1; i <= n; ++i) fact[i] = Mul(fact[i - 1], i);
  ifact[n] = Inv(fact[n]);
  for (int i = n; i >= 1; --i) ifact[i - 1] = Mul(ifact[i], i);
}

void InitPow(int x, int n) {
  pow[0] = 1;
  for (int i = 1; i <= n; ++i) pow[i] = Mul(pow[i - 1], x);
}

int main(void) {
  scanf("%d", &n);
  SA = SB = 0;
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", A + i, B + i);
    --B[i];
    Add(SA, A[i]);
    Add(SB, B[i]);
  }
  FILL(f, SB + 1, 0);
  f[0][0] = Sub(-1);

  InitFact(SB);

  for (int id = 0; id < n; ++id) {
    FILL(f2, SB + 1, 0);
    int Ai = A[id], Bi = B[id];
    InitPow(Ai, Bi);

    for (int m = 0; m <= SB; ++m) {
      for (int sa = 0; sa <= SA; ++sa) {
        int val = f[m][sa];
        if (val == 0) continue;

        // don't choose id
        Add(f2[m][sa], val);

        // choose with x^i
        for (int i = 0; i <= Bi; ++i) {
          int coeff = Mul(pow[i], ifact[i]);
          Add(f2[m + i][sa + Ai], Mul(val, Sub(-coeff)));
        }
      }
    }

    COPY(f2, SB + 1, f);
  }

  int ans = 0;

  for (int m = 0; m <= SB; ++m) {
    for (int sa = 0; sa <= SA; ++sa) {
      int val = f[m][sa];
      if (val == 0) continue;
      Add(ans, Mul(val, fact[m], Inv(Pow(sa, m + 1))));
    }
  }
  ans = Mul(ans, SA);
  printf("%d\n", ans);
  return 0;
}
