Description
对于一个长度为 n 的排列 p=p[0],p[1],p[2],…,p[n−1](包含数字 1,2,3,…,n 的一个全排列),我们定义分割排列(split)为一个排列 q,它可以通过以下过程得到:
- 选择两个数集
A=i1,i2,…,ik
B=j1,j2,…,jl
满足:
- A∩B=∅
- A∪B={0,1,2,…,n−1}
- i1<i2<…<ik
- j1<j2<…<jl
- 将 q 定义为:$$q = p[i_1]\, p[i_2] \ldots p[i_k]\, p[j_1]\, p[j_2] \ldots p[j_l]$$
进一步,我们定义 S(p) 为排列 p 的所有分割排列的集合。
现在,给定一个整数 n 和一个集合 T,其中包含 m 个长度为 n 的排列。要求统计有多少个长度为 n 的排列 p 满足 T⊆S(p)。由于答案可能很大,请将结果对 998244353 取模。
实现细节
你需要实现以下函数:
int solve(int n, int m, std::vector<std::vector<int>>& splits);
- n:排列的长度
- m:给定的分割排列数量
splits:包含 m 个两两不同的排列,表示集合 T,该集合是某个 p 的 S(p) 的子集
该过程应返回满足条件的排列数量,结果对 998244353 取模。该过程在每个测试用例中仅调用一次。
3 2
1 2 3
2 1 3
4
Hint
样例解释 1
考虑以下调用:
solve(3, 2, {{1, 2, 3}, {2, 1, 3}})
在此例中,排列 p 的长度为 3,给定的分割排列有:
只有以下 4 个排列 p 可以同时生成这两个分割排列:
- 123
- 132
- 213
- 231
因此答案为 4。
数据范围
- 1≤n≤300
- 1≤m≤300
子任务
- (6 分)m=1
- (7 分)1≤n,m≤10
- (17 分)1≤n,m≤18
- (17 分)1≤n≤30, 1≤m≤15
- (16 分)1≤n,m≤90
- (16 分)1≤n≤300, 1≤m≤15
- (21 分)无额外限制
翻译由 ChatGPT-5 完成