猜猜题
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\hspace{15pt}Bob 手里有一个长度为 n 的未知整数数组 a_1, a_2, \dots, a_n,Alice 需要通过向 Bob 询问来确定数组中的每一个元素 a_i

\hspace{15pt}Bob 一开始手里有 m 个区间 [l_i, r_i],这些区间互不相同互不部分重叠(即允许包含),即对于任意两个不同的区间 i, j,不存在 l_i < l_j \leq r_i < r_j
\hspace{15pt}Alice 每次询问时,Bob 会从当前剩余的区间中等概率随机抽取一个区间 [l, r],告知 Alice 该区间的范围 [l, r] 以及对应元素的总和 \textstyle\sum_{i=l}^r a_i,随后该区间被移除。

\hspace{15pt}Alice 绝对聪明,当她获得的信息足以唯一确定数组 a 中的所有元素时,她会停止询问。

\hspace{15pt}如果 Alice 永远无法唯一确定数组 a 中的所有元素,直接输出 -1(不需要取模);否则,输出 Alice 停止询问时的询问次数 X 的数学期望 E(X)。可以证明答案可以表示为一个不可约分数 \tfrac{p}{q},为了避免精度问题,请直接输出整数 \left(p \times q^{-1} \bmod M\right) 作为答案,其中 M = 998\,244\,353q^{-1} 是满足 q\times q^{-1} \equiv 1 \pmod{M} 的整数。

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leq T\leq 100\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行输入两个正整数 n, m\left(1 \le n, m \le 5\times 10^3\right),表示数组长度、初始区间个数。
\hspace{15pt}此后 m 行,第 i 行输入两个正整数 l_i, r_i\left(1 \le l_i \le r_i \le n\right),表示 Bob 手中的第 i 个区间。保证区间互不相同也互不重叠。

\hspace{15pt}除此之外,保证单个测试文件的 n 之和、m 之和不超过 5 \times 10^3

输出描述:

\hspace{15pt}对于每一组测试数据,新起一行。若无法唯一确定数组,输出 -1,否则,输出 Alice 停止询问时的询问次数 X 的数学期望 E(X)998\,244\,353 取模的结果。
示例1

输入

复制
3
5 6
1 1
2 2
4 4
5 5
1 4
1 5
3 3
1 1
2 2
1 3
2 1
1 1

输出

复制
499122182
3
-1