CF2245F Familiar?
题目描述
**注意:不寻常的内存限制。**
考虑下面这段处理长度为 $n$ 的排列 $p$ 的伪代码:
```
函数 mystery(p):
n = p 的长度
st = 空栈
count = 长度为 n 且全部初始化为 0 的数组
对于 i 从 1 到 n:
当 st 非空 且 p[i] < st 的栈顶元素 时:
弹出栈顶元素
count[i] = count[i] + 1
将 p[i] 压入 st
返回 count
```
给定一个长度为 $n$ 的数组 $a$。你的任务是计算有多少个长度为 $n$ 的排列 $p$,使得若 $b$ 是 `mystery(p)` 返回的数组,则对所有满足 $a_i \neq -1$ 的下标 $i$($1 \le i \le n$),都有 $a_i = b_i$ 成立。
由于答案可能很大,请对 $998\,244\,353$ 取模。
($^*$ 长度为 $n$ 的排列是一个由 $n$ 个互不相同的整数构成的数组,这些整数在 $1$ 到 $n$ 之间按任意顺序排列。例如,$[2,3,1,5,4]$ 是一个排列,但 $[1,2,2]$ 不是(因为 $2$ 出现了两次),而 $[1,3,4]$ 也不是(因为 $n=3$ 但数组中包含 $4$)。)
输入格式
每个测试包含多个测试用例。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。接下来是各个测试用例的描述。
每个测试用例的第一行包含一个整数 $n$($1 \le n \le 500$),表示 $a$ 的长度。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($-1 \le a_i \le n$),表示 $a$ 中的元素。
保证所有测试用例的 $n^3$ 之和不超过 $500^3$。
输出格式
对于每个测试用例,输出一个整数,表示满足条件的排列数量,对 $998\,244\,353$ 取模。
说明/提示
在第一个和第二个测试用例中,唯一有效的排列是 $[1]$。
在第四个测试用例中,有效的排列是 $[1,2,4,3]$、$[3,4,2,1]$ 和 $[1,4,3,2]$。
在第五个测试用例中,所有长度为 $6$ 的排列都是有效的。
---
翻译由 Deepseek-V3 完成。