#CF1909F2. 小排列问题(困难版)

小排列问题(困难版)

第一步:题目翻译(中文排版,数字与公式加 $)

F2. 小排列问题(困难版)
时间限制:每个测试点 22
空间限制:每个测试点 256256 MB

在简单版本中,aia_i 的范围是 [0,n][0,n];在困难版本中,aia_i 的范围是 [1,n][-1,n],并且好排列的定义略有不同。只有解决了所有版本的问题,你才能进行 hack。

给定一个整数 nn 和一个数组 a1,a2,,ana_1, a_2, \dots, a_n,其中每个 aia_i 属于 [1,n][-1,n]

一个 [1,2,,n][1,2,\dots,n] 的排列 p1,p2,,pnp_1,p_2,\dots,p_n 被称为 好排列,如果对于每个 ii,满足以下条件:

  • ai1a_i \ne -1,则在前 ii 个位置 [p1,p2,,pi][p_1, p_2, \dots, p_i] 中,数值 i\le i 的数的个数 恰好 等于 aia_i

请计算好排列的数量,结果对 998244353998244353 取模。


输入格式
每个测试点包含多个测试用例。第一行包含一个整数 tt1t1041 \le t \le 10^4)表示测试用例数。接下来是每个测试用例的描述。

每个测试用例的第一行是一个整数 nn1n21051 \le n \le 2\cdot 10^5)——数组 aa 的长度。
第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n1ain-1 \le a_i \le n),描述了好排列需要满足的条件。

保证所有测试用例的 nn 之和不超过 21052\cdot 10^5


输出格式
对于每个测试用例,输出一行一个整数,表示好排列的数量,对 998244353998244353 取模。


样例输入

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

样例解释

  • 第一个测试用例:所有 5!=1205! = 120 个排列都是好的。
  • 第二个测试用例:唯一的好排列是 [1,2,3,4,5][1,2,3,4,5]
  • 第三个测试用例:有 44 个好排列,例如 [2,1,5,6,3,4][2,1,5,6,3,4] 等。
  • 其余解释略。