#CF1909F2. 小排列问题(困难版)
小排列问题(困难版)
第一步:题目翻译(中文排版,数字与公式加 $)
F2. 小排列问题(困难版)
时间限制:每个测试点 秒
空间限制:每个测试点 MB
在简单版本中, 的范围是 ;在困难版本中, 的范围是 ,并且好排列的定义略有不同。只有解决了所有版本的问题,你才能进行 hack。
给定一个整数 和一个数组 ,其中每个 属于 。
一个 的排列 被称为 好排列,如果对于每个 ,满足以下条件:
- 若 ,则在前 个位置 中,数值 的数的个数 恰好 等于 。
请计算好排列的数量,结果对 取模。
输入格式
每个测试点包含多个测试用例。第一行包含一个整数 ()表示测试用例数。接下来是每个测试用例的描述。
每个测试用例的第一行是一个整数 ()——数组 的长度。
第二行包含 个整数 (),描述了好排列需要满足的条件。
保证所有测试用例的 之和不超过 。
输出格式
对于每个测试用例,输出一行一个整数,表示好排列的数量,对 取模。
样例输入
10
5
-1 -1 -1 -1 -1
5
1 2 3 4 5
6
0 2 2 2 -1 -1
6
-1 -1 -1 -1 -1 5
6
-1 -1 3 2 -1 -1
15
0 0 -1 -1 -1 2 2 -1 -1 -1 -1 9 11 13 15
6
0 2 2 2 4 6
6
0 1 3 4 5 5
6
1 2 3 2 4 6
15
0 0 1 1 1 2 3 4 5 6 7 9 11 13 15
样例输出
120
1
4
0
0
494403526
4
0
0
532305727
样例解释
- 第一个测试用例:所有 个排列都是好的。
- 第二个测试用例:唯一的好排列是 。
- 第三个测试用例:有 个好排列,例如 等。
- 其余解释略。