/*
Telebe of Adicto && Mamedov yani AzeTurk810
I see humans but no humanity
*/
#include <algorithm>
#include <array>
#include <iostream>
#include <map>
#include <regex>
#include <unordered_map>
#include <utility>
#include <vector>
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
using ll = long long;
using namespace std;
#define ln '\n'
#define INFi 1e9
#define INFll 1e18
#define map unordered_map
#ifdef ONPC
#include <algo.hpp>
#else
#define dbg(...)
#define dbg_out(...)
#endif
constexpr ll MOD = 1e9 + 7, N = 505, M = N * 4;
int _n, _m;
ll dp[N], pref[N], dp2[N][N], L[N], R[N], fact[N], invfact[N], ff[N];
ll ans;
long long bp(long long a, long long b) {
long long res = 1;
while (b > 0) {
if (b & 1LL)
res = (res * a) % MOD;
a = (a * a) % MOD;
b >>= 1;
}
return res;
}
inline ll inv(ll v) {
if (ff[v] == 0)
ff[v] = bp(v, MOD - 2);
return ff[v];
}
inline ll add(ll l, ll r) {
l += r;
while (l >= MOD) {
l -= MOD;
}
return l;
}
inline ll mult(ll l, ll r) {
return (l * r) % MOD;
}
inline ll del(ll r, ll l) {
return (r - l + MOD) % MOD;
}
inline void init_comb() {
fact[0] = 1;
for (int i = 1; i < N; i++) {
fact[i] = mult(fact[i - 1], i);
}
invfact[N - 1] = inv(fact[N - 1]);
for (int i = N - 2; i >= 0; --i) {
invfact[i] = mult(invfact[i + 1], i + 1);
}
}
inline ll C(ll n, ll k) {
if (k < 0 || k > _n)
return 0;
dbg(make_pair(n, k));
dbg(invfact[k]);
dbg(invfact[n - k]);
dbg(fact[n]);
return mult(fact[n], mult(invfact[k], invfact[n - k]));
}
vector<ll> compsf;
map<ll, ll> compr, rev;
int compress() {
sort(compsf.begin(), compsf.end());
compsf.erase(unique(compsf.begin(), compsf.end()), compsf.end());
ll nxt = 0;
for (const ll &v : compsf) {
rev[nxt] = v;
compr[v] = nxt++;
}
return compsf.size();
}
inline void systemd() {
init_comb();
}
char solve() {
if (!(cin >> _n))
return 1;
systemd();
for (size_t i = 1; i <= _n; i++) {
cin >> L[i] >> R[i];
R[i]++;
compsf.push_back(L[i]);
compsf.push_back(R[i]);
}
_m = compress();
dp[0] = 1;
for (int z = 1; z < _m; z++) {
int st = rev[z - 1], fs = rev[z], sz = fs - st;
vector<int> can;
pref[0] = 1;
for (int i = 1; i <= _n; i++) {
pref[i] = add(pref[i - 1], dp[i]);
if (L[i] <= st && fs <= R[i]) {
can.push_back(i);
}
}
int m = can.size();
if (m == 0)
continue;
int lim = min(m, sz);
for (int k = 1; k <= lim; ++k)
for (int j = 0; j < m; ++j)
dp2[k][j] = 0;
for (int k = 1; k <= lim; k++) {
for (int j = k - 1; j < m; j++) {
if (k == 1) {
ll val = mult(pref[can[j] - 1], sz);
if (j)
val = add(val, dp2[k][j - 1]);
dp2[k][j] = val;
continue;
}
ll val = mult(dp2[k - 1][j - 1], inv(k));
val = mult(val, sz - k + 1);
dbg(val);
if (j)
val = add(val, dp2[k][j - 1]);
dp2[k][j] = val;
}
}
for (int k = 1; k <= lim; k++) {
for (int j = k - 1; j < m; ++j) {
ll ex = dp2[k][j];
if (j)
ex = del(ex, dp2[k][j - 1]);
dp[can[j]] = add(dp[can[j]], ex);
}
}
}
ans = 0;
for (size_t i = 1; i <= _n; i++) {
ans = add(ans, dp[i]);
}
cout << ans << ln;
return 0;
}
// Attack on titan<3
signed main() {
ios::sync_with_stdio(0);
cin.tie(nullptr);
int t = 1e9;
// cin >> t;
for (int cases = 0; cases < t; cases++) {
if (solve())
break;
#ifdef ONPC
cerr << "__________\n";
#endif
}
}
// Just Imaginary
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠀⠀⠀⢀⣴⣾⠀⠀⠀⡀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣦⣾⣿⣿⣿⣿⣿⡆⠁⠀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⡠⠂⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠠⠔⠚⣿⣿⣿⣿⣿⣦⡄⠀⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⠠⠐⢂⠉⡀⣀⣤⣄⢻⣿⣿⡟⢈⡹⣿⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⡀⠄⠂⠈⠀⣶⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠘⣷⡀⠀⡀⠐⠂⠐⢄
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠟⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣀⣾⣷⠯⠀⠤⠤⠄⠈
⠀⠀⠀⠀⠀⠀⣼⣿⡟⠀⠀⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣰⣿⠋⠀⠀⢠⣾⣿⣿⣿⣿⣿⣭⠟⢻⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀
⠀⠀⠀⣀⣶⡟⠁⠀⢾⣶⣿⠟⠉⠈⢻⣿⣿⣿⣦⣜⠀⠛⠛⠿⠁⠀⠀⠀⠀⠀
⠚⠻⠿⠿⡿⠁⠀⢠⣿⣿⠁⠀⣠⠖⠋⠉⠻⣿⣿⣿⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣰⣿⡿⠃⠠⠊⠁⠀⠀⠀⠀⠈⢿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣴⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣠⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢀⣴⠾⠟⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/