题库练习 Bombing (Easy Version)
← 上一题 下一题 →

A16653 | Bombing (Easy Version)

时间限制1s
内存限制256MB
通过 / 提交0/0

题目描述

这是本题的简单版本。不同版本的区别在于本版本中 $n \leq 3000$。只有当你解决了所有版本的问题后,才可以进行 hack。

如果一个排列 $b$ 是排列 $a$ 的一次 “riffle shuffle”,需要满足 $|a| = |b|$,并且存在一个 $k$,$1 \leq k < |a|$,使得 $a_1,a_2,\ldots,a_k$ 和 $a_{k+1},a_{k+2},\ldots,a_{|a|}$ 都是 $b$ 的子序列。

例如,$[\color{red}{1}, \color{blue}{4}, \color{blue}{5}, \color{red}{2}, \color{red}{3}, \color{blue}{6}]$ 是 $[\color{red}{1}, \color{red}{2}, \color{red}{3}, \color{blue}{4}, \color{blue}{5}, \color{blue}{6}]$ 的一次 riffle shuffle,因为我们可以选 $k = 3$,且 $[\color{red}{1}, \color{red}{2}, \color{red}{3}]$ 和 $[\color{blue}{4}, \color{blue}{5}, \color{blue}{6}]$ 都是子序列。

给定一个长度为 $n$ 的排列 $p$,其中有些位置被替换为 $-1$。请你计算有多少种方式将每个 $-1$ 替换为一个整数,使得 $p$ 变成 $[1,2,\ldots,n]$(即升序排列)的一个 riffle shuffle。

由于方案数可能非常大,请你输出其对 $998\,244\,353$ 取模的结果。

$^*$ 一个长度为 $n$ 的排列是由 $1$ 到 $n$ 的 $n$ 个互不相同的整数按任意顺序组成的数组。例如,$[2,3,1,5,4]$ 是一个排列,但 $[1,2,2]$ 不是($2$ 出现了两次),$[1,3,4]$ 也不是($n=3$,但出现了 $4$)。

$^\dagger$ 如果一个序列 $c$ 能通过从另一个序列 $d$ 删除若干(可以为零或全部)元素而得到,那么称 $c$ 是 $d$ 的子序列。

输入格式

每个测试用例包含多组数据。第一行为测试用例个数 $t$($1 \leq t \leq 100$)。下接每组测试数据。

每组测试数据第一行为排列的长度 $n$($2 \leq n \leq 3000$)。

第二行为 $n$ 个整数 $p_1, p_2, \ldots, p_n$($1 \leq p_i \leq n$ 或 $p_i = -1$)——排列 $p$ 的元素。所有非 $-1$ 的 $p_i$ 两两不相同。

所有测试用例中 $n$ 的总和不超过 $3000$。

输出格式

对于每个测试用例,输出一个整数,表示将 $p$ 填补为 $[1,2,\ldots,n]$ 的一次 riffle shuffle 的方案数,对 $998\,244\,353$ 取模。

输入输出样例

输入 #1
7
5
-1 -1 -1 -1 -1
4
1 2 3 4
5
-1 -1 -1 2 -1
6
-1 3 2 1 -1 -1
18
11 -1 2 -1 -1 -1 -1 6 -1 -1 14 8 9 15 -1 -1 -1 -1
6
-1 3 -1 4 -1 5
3
-1 2 1
输出 #1
27
1
6
0
32
0
0
C++ 编辑器
输入
输出