← Home
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

const MOD = 998244353

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') && data[idx] != '-' {
			idx++
		}
		sign := 1
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val * sign
	}

	n := nextInt()
	m := nextInt()

	l := make([]int, n)
	r := make([]int, n)
	minR := m
	sumL0 := 0
	for i := 0; i < n; i++ {
		l[i] = nextInt()
		r[i] = nextInt()
		if r[i] < minR {
			minR = r[i]
		}
		sumL0 += l[i]
	}

	if sumL0 > m || m < n {
		fmt.Println(0)
		return
	}

	limit := min(minR, m/n)
	if limit == 0 {
		fmt.Println(0)
		return
	}

	mu := make([]int, limit+1)
	isComp := make([]bool, limit+1)
	primes := make([]int, 0)
	mu[1] = 1
	for i := 2; i <= limit; i++ {
		if !isComp[i] {
			primes = append(primes, i)
			mu[i] = -1
		}
		for _, p := range primes {
			v := i * p
			if v > limit {
				break
			}
			isComp[v] = true
			if i%p == 0 {
				mu[v] = 0
				break
			}
			mu[v] = -mu[i]
		}
	}

	arr1 := make([]int, m+1)
	arr2 := make([]int, m+1)
	widths := make([]int, n)

	ans := 0

	for d := 1; d <= limit; d++ {
		md := mu[d]
		if md == 0 {
			continue
		}

		S := m / d
		sumL := 0
		ok := true

		for i := 0; i < n; i++ {
			L := (l[i] + d - 1) / d
			U := r[i] / d
			if U < L {
				ok = false
				break
			}
			widths[i] = U - L
			sumL += L
			if sumL > S {
				ok = false
				break
			}
		}

		if !ok {
			continue
		}

		T := S - sumL
		dp := arr1
		ndp := arr2
		dp[0] = 1
		maxSum := 0

		for i := 0; i < n; i++ {
			w := widths[i]
			newMax := maxSum + w
			if newMax > T {
				newMax = T
			}
			window := 0
			for s := 0; s <= newMax; s++ {
				if s <= maxSum {
					window += dp[s]
					if window >= MOD {
						window -= MOD
					}
				}
				rem := s - w - 1
				if rem >= 0 && rem <= maxSum {
					window -= dp[rem]
					if window < 0 {
						window += MOD
					}
				}
				ndp[s] = window
			}
			dp, ndp = ndp, dp
			maxSum = newMax
		}

		cnt := 0
		for s := 0; s <= maxSum; s++ {
			cnt += dp[s]
			if cnt >= MOD {
				cnt -= MOD
			}
		}

		if md == 1 {
			ans += cnt
			if ans >= MOD {
				ans -= MOD
			}
		} else {
			ans -= cnt
			if ans < 0 {
				ans += MOD
			}
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprint(out, ans)
	out.Flush()
}