#P12506. 「CEOI2025」分割

「CEOI2025」分割

注意事项

请在提交源代码前添加 #include "splits.h"

题目描述

对于一个数字 1,2,3,,n1, 2, 3, \ldots, n 的排列 p=p[0] p[1] p[2]  p[n1]p = p[0]\ p[1]\ p[2]\ \ldots\ p[n-1],我们定义一个分割为通过以下过程可以获得的排列 qq

  1. 选择两个数字集合 A={i1,i2,,ik}A = \{i_{1}, i_{2}, \ldots, i_{k}\}B={j1,j2,,jl}B = \{j_{1}, j_{2}, \ldots, j_{l}\},使得 AB=A \cap B = \emptysetAB={0,1,2,,n1}A \cup B = \{0, 1, 2, \ldots, n-1\}i1<i2<<iki_{1} < i_{2} < \ldots < i_{k}j1<j2<<jlj_{1} < j_{2} < \ldots < j_{l}
  2. 排列 qq 将是 $q = p[i_{1}]\ p[i_{2}]\ \ldots\ p[i_{k}]\ p[j_{1}]\ p[j_{2}]\ \ldots\ p[j_{l}]$。

此外,我们定义 S(p)S(p) 为排列 pp 的所有分割的集合。

给你一个数字 nn 和一个包含 mm 个长度为 nn 的排列的集合 TT。计算存在多少个长度为 nn 的排列 pp,使得 TS(p)T \subseteq S(p)。由于这个数字可能很大,请计算其对 998244353998244353 取模的结果。

实现细节

你应该实现以下程序:

int solve(int n, int m, std::vector<std::vector<int>>& splits);
  • nn:排列的大小
  • mm:分割的数量
  • splitssplits:包含 mm 个互不相同的排列的数组,集合 TT 的元素,TTS(p)S(p) 的子集
  • 该程序应返回可能的排列数量对 998244353998244353 取模的结果。
  • 对于每个测试点,该程序只被调用一次。

示例评测程序

示例评测程序读取以下格式的输入:

  • 11 行:n mn\ m
  • 2+i2+i 行:s[i][0] s[i][1]  s[i][n1]s[i][0]\ s[i][1]\ \ldots\ s[i][n-1] 对于所有 0i<m0 \leq i < m

并输出调用函数 solve 的结果,使用相应的参数。

样例

考虑以下调用:

solve(3, 2, {{1, 2, 3}, {2, 1, 3}})

在这个样例中,排列 pp 的大小为 33,我们给定了 22 个分割:

  • 1 2 31\ 2\ 3
  • 2 1 32\ 1\ 3

函数调用将返回 44,因为只有 44 个排列 pp 可以生成这两个分割:

  • 1 2 31\ 2\ 3
  • 1 3 21\ 3\ 2
  • 2 1 32\ 1\ 3
  • 2 3 12\ 3\ 1

数据范围与提示

对于所有输入数据,满足:

  • 1n3001 \leq n \leq 300
  • 1m3001 \leq m \leq 300

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 66 m=1m=1
22 77 1n,m101 \leq n, m \leq 10
33 1717 1n,m181 \leq n, m \leq 18
44 1717 1n30,1m151 \leq n \leq 30, 1 \leq m \leq 15
55 1616 1n,m901 \leq n, m \leq 90
66 1616 1n300,1m151 \leq n \leq 300, 1 \leq m \leq 15
77 2121 无附加限制