#P13694. [CEOI 2025] Splits

[CEOI 2025] Splits

Description

对于一个长度为 nn 的排列 p=p[0],p[1],p[2],,p[n1]p = p[0], p[1], p[2], \ldots, p[n - 1](包含数字 1,2,3,,n1, 2, 3, \ldots, n 的一个全排列),我们定义分割排列(split)为一个排列 qq,它可以通过以下过程得到:

  1. 选择两个数集
    A=i1,i2,,ikA = i_1, i_2, \ldots, i_k
    B=j1,j2,,jlB = j_1, j_2, \ldots, j_l
    满足:
    • AB=A \cap B = \emptyset
    • AB={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 和一个集合 TT,其中包含 mm 个长度为 nn 的排列。要求统计有多少个长度为 nn 的排列 pp 满足 TS(p)T \subseteq S(p)。由于答案可能很大,请将结果对 998244353998\,244\,353 取模。

实现细节

你需要实现以下函数:

int solve(int n, int m, std::vector<std::vector<int>>& splits);
  • nn:排列的长度
  • mm:给定的分割排列数量
  • splits:包含 mm 个两两不同的排列,表示集合 TT,该集合是某个 ppS(p)S(p) 的子集

该过程应返回满足条件的排列数量,结果对 998244353998\,244\,353 取模。该过程在每个测试用例中仅调用一次。

3 2
1 2 3
2 1 3
4

Hint

样例解释 1

考虑以下调用:

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

在此例中,排列 pp 的长度为 33,给定的分割排列有:

  • 123123
  • 213213

只有以下 44 个排列 pp 可以同时生成这两个分割排列:

  • 123123
  • 132132
  • 213213
  • 231231

因此答案为 44

数据范围

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

子任务

  1. (6 分)m=1m = 1
  2. (7 分)1n,m101 \leq n, m \leq 10
  3. (17 分)1n,m181 \leq n, m \leq 18
  4. (17 分)1n30, 1m151 \leq n \leq 30,\ 1 \leq m \leq 15
  5. (16 分)1n,m901 \leq n, m \leq 90
  6. (16 分)1n300, 1m151 \leq n \leq 300,\ 1 \leq m \leq 15
  7. (21 分)无额外限制

翻译由 ChatGPT-5 完成