对于由数字 $1, 2, 3, \dots, n$ 组成的排列 $p = p[0] p[1] p[2] \dots p[n - 1]$,我们定义一个分裂(split)为可以通过以下过程得到的排列 $q$:
- 选择两个数字集合 $A = \{ i_1, i_2, \dots, i_k \}$ 和 $B = \{ j_1, j_2, \dots, j_l \}$,满足 $A \cap B = \emptyset$,$A \cup B = \{ 0, 1, 2, \dots, n - 1 \}$,$i_1 < i_2 < \dots < i_k$ 且 $j_1 < j_2 < \dots < j_l$。
- 排列 $q$ 将为 $q = p[i_1]p[i_2]\dots p[i_k]p[j_1]p[j_2]\dots p[j_l]$。
此外,我们定义 $S(p)$ 为排列 $p$ 的所有分裂组成的集合。
给你一个数字 $n$ 和一个由 $m$ 个长度为 $n$ 的排列组成的集合 $T$。统计有多少个长度为 $n$ 的排列 $p$ 满足 $T \subseteq S(p)$。由于这个数量可能很大,请输出它模 $998\,244\,353$ 的值。
实现细节
你需要实现以下函数:
int solve(int n, int m, std::vector<std::vector<int>>& splits);
n:排列的大小。m:分裂的数量。splits:包含 $m$ 个两两不同的排列的数组,即集合 $T$ 的元素,它是 $S(p)$ 的子集。- 该函数应返回可能排列的数量模 $998\,244\,353$ 的值。
- 对于每个测试用例,该函数恰好被调用一次。
数据范围
- $1 \le n \le 300$
- $1 \le m \le 300$
子任务
- (6 分) $m = 1$
- (7 分) $1 \le n, m \le 10$
- (17 分) $1 \le n, m \le 18$
- (17 分) $1 \le n \le 30, 1 \le m \le 15$
- (16 分) $1 \le n, m \le 90$
- (16 分) $1 \le n \le 300, 1 \le m \le 15$
- (21 分) 无附加限制。
样例
样例 1
考虑以下调用:
solve(3, 2, {{1, 2, 3}, {2, 1, 3}})
在这个样例中,排列 $p$ 的大小为 $3$,我们得到了 $2$ 个分裂:
1 2 32 1 3
函数调用将返回 $4$,因为只有四个排列 $p$ 可以生成这两个分裂:
1 2 31 3 22 1 32 3 1
评测程序示例
评测程序示例按以下格式读取输入:
- 第 1 行:$n \ m$
- 第 $2 + i$ 行:对于所有 $0 \le i < m$,为 $s[i][0] \ s[i][1] \ \dots \ s[i][n - 1]$
并输出调用 solve 伴随相应参数的结果。