#include <bits/stdc++.h>
using namespace std;
void fastIO() {
  std::ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
template <typename T, typename U>
inline void mnze(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
inline void mxze(T &x, U y) {
  if (x < y) x = y;
}
void _scan(int &x) { scanf("%d", &x); }
void _scan(long long &x) { scanf("%lld", &x); }
void _scan(double &x) { scanf("%lf", &x); }
void _scan(char &x) { scanf(" %c", &x); }
void _scan(char *x) { scanf("%s", x); }
template <typename T>
void _scan(vector<T> &v) {
  for (int i = 0; i < (int)v.size(); i++) _scan(v[i]);
}
void scan() {}
template <typename T, typename... U>
void scan(T &head, U &...tail) {
  _scan(head);
  scan(tail...);
}
template <typename T>
void _dbg(const char *sdbg, T h) {
  cerr << sdbg << "=" << h << "\n";
}
template <typename T, typename... U>
void _dbg(const char *sdbg, T h, U... t) {
  while (*sdbg != ',') cerr << *sdbg++;
  cerr << "=" << h << ",";
  _dbg(sdbg + 1, t...);
}
const long long MOD = 998244353;
inline long long Msum(long long x) { return x; }
template <typename... Rest>
inline long long Msum(long long x, Rest... rest) {
  return (x + Msum(rest...)) % MOD;
}
inline long long Mprod(long long x) { return x; }
template <typename... Rest>
inline long long Mprod(long long x, Rest... rest) {
  return x * Mprod(rest...) % MOD;
}
inline long long Mnorm(long long x) { return (x % MOD + MOD) % MOD; }
inline long long sq(long long x) { return x * x % MOD; }
inline long long pot(long long b, long long e) {
  if (!e) return 1;
  return sq(pot(b, e >> 1)) * (e & 1 ? b : 1) % MOD;
}
inline long long inv(long long x) { return pot(x, MOD - 2); }
const int MAXN = 52;
long long d(int k, int n) {
  long long ret = 1;
  for (int i = 0; i < n; i++) ret = Mprod(ret, n + k - 1 - i);
  long long fact = 1;
  for (int i = 2; i <= n; i++) fact = Mprod(fact, i);
  return Mprod(ret, inv(fact));
}
int n, l[MAXN], r[MAXN];
long long s[MAXN];
vector<int> x;
long long dp[MAXN][2 * MAXN];
long long f(int first, int lst, int xi) {
  if (first == n) return 1;
  if (xi + 1 == (int)x.size()) return 0;
  long long &ret = dp[first][xi];
  if (ret != -1) return ret;
  while (lst < n && l[lst] <= x[xi]) lst++;
  for (int i = first; i < lst; i++)
    if (r[i] < x[xi]) return ret = 0;
  ret = f(first, lst, xi + 1);
  long long sz = x[xi + 1] - x[xi];
  long long p = 1;
  for (int i = first; i < lst; i++) {
    p = Mprod(p, inv(s[i]));
    ret = Msum(ret, Mprod(p, d(sz, i - first + 1), f(i + 1, lst, xi + 1)));
  }
  return ret;
}
int main() {
  scan(n);
  for (int i = 0; i < n; i++) scan(l[i], r[i]);
  reverse(l, l + n);
  reverse(r, r + n);
  for (int i = 0; i < n; i++) s[i] = r[i] - l[i] + 1;
  bool good = true;
  for (int i = 1; i < n; i++)
    if (r[i] < l[i - 1]) good = false;
  if (!good) {
    printf("0\n");
    return 0;
  }
  for (int i = 0; i < n; i++) {
    x.push_back(l[i]);
    x.push_back(r[i] + 1);
  }
  sort(x.begin(), x.end());
  x.resize(distance(x.begin(), unique(x.begin(), x.end())));
  memset(dp, -1, sizeof(dp));
  printf("%lld\n", f(0, 0, 0));
}
