← Home
package main

import (
	"os"
)

const MOD = 998244353

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

func modInverse(n int64) int64 {
	return powExp(n, MOD-2)
}

func main() {
	buf := make([]byte, 65536)
	var pos, length int
	readByte := func() byte {
		if pos >= length {
			n, err := os.Stdin.Read(buf)
			if n == 0 || err != nil {
				return 0
			}
			pos = 0
			length = n
		}
		b := buf[pos]
		pos++
		return b
	}

	readInt := func() int64 {
		var res int64
		b := readByte()
		for b <= ' ' {
			if b == 0 {
				return 0
			}
			b = readByte()
		}
		for b > ' ' {
			res = res*10 + int64(b-'0')
			b = readByte()
		}
		return res
	}

	n := int(readInt())
	if n == 0 {
		return
	}
	m := int(readInt())

	head := make([]int, m+1)
	for i := 0; i <= m; i++ {
		head[i] = -1
	}
	next := make([]int, n)
	l_arr := make([]int, n)
	w_arr := make([]int64, n)

	C := int64(1)

	for i := 0; i < n; i++ {
		l := int(readInt())
		r := int(readInt())
		p := readInt()
		q := readInt()

		pMod := p % MOD
		qMinusP := (q - p) % MOD
		if qMinusP < 0 {
			qMinusP += MOD
		}

		invQMinusP := modInverse(qMinusP)
		w := (pMod * invQMinusP) % MOD

		l_arr[i] = l
		w_arr[i] = w
		next[i] = head[r]
		head[r] = i

		term := (qMinusP * modInverse(q)) % MOD
		C = (C * term) % MOD
	}

	dp := make([]int64, m+1)
	dp[0] = 1

	for x := 1; x <= m; x++ {
		for i := head[x]; i != -1; i = next[i] {
			l := l_arr[i]
			w := w_arr[i]
			dp[x] = (dp[x] + dp[l-1]*w) % MOD
		}
	}

	ans := (dp[m] * C) % MOD

	var printInt func(int64)
	printInt = func(val int64) {
		if val == 0 {
			os.Stdout.Write([]byte{'0', '\n'})
			return
		}
		var out []byte
		for val > 0 {
			out = append(out, byte(val%10)+'0')
			val /= 10
		}
		for i, j := 0, len(out)-1; i < j; i, j = i+1, j-1 {
			out[i], out[j] = out[j], out[i]
		}
		out = append(out, '\n')
		os.Stdout.Write(out)
	}

	printInt(ans)
}