← Home
package main

import (
	"fmt"
	"sort"
)

const MOD = 998244353

func pow(base, exp int) int {
	res := 1
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func inv(n int) int {
	return pow(n, MOD-2)
}

func main() {
	var n int
	if _, err := fmt.Scan(&n); err != nil {
		return
	}

	l := make([]int, n)
	r := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&l[i], &r[i])
	}

	L_arr := make([]int, n)
	R_arr := make([]int, n)
	for i := 0; i < n; i++ {
		L_arr[i] = l[n-1-i]
		R_arr[i] = r[n-1-i]
	}

	var V []int
	for i := 0; i < n; i++ {
		V = append(V, l[i])
		V = append(V, r[i]+1)
	}
	sort.Ints(V)

	var U []int
	for i := 0; i < len(V); i++ {
		if i == 0 || V[i] != V[i-1] {
			U = append(U, V[i])
		}
	}

	S := make([]int, n+1)
	S[0] = 1

	for j := 0; j < len(U)-1; j++ {
		L := U[j+1] - U[j]
		c := make([]int, n+1)
		c[0] = 1
		for k := 1; k <= n; k++ {
			c[k] = c[k-1] * ((L + k - 1) % MOD) % MOD * inv(k) % MOD
		}

		new_S := make([]int, n+1)
		copy(new_S, S)

		for i := 1; i <= n; i++ {
			for k := 1; k <= i; k++ {
				valid := true
				for x := i - k + 1; x <= i; x++ {
					if L_arr[x-1] > U[j] || R_arr[x-1] < U[j+1]-1 {
						valid = false
						break
					}
				}
				if valid {
					new_S[i] = (new_S[i] + c[k]*S[i-k]) % MOD
				}
			}
		}
		S = new_S
	}

	total := 1
	for i := 0; i < n; i++ {
		ways := (r[i] - l[i] + 1) % MOD
		total = (total * ways) % MOD
	}

	ans := (S[n] * inv(total)) % MOD
	fmt.Println(ans)
}