SZTG-L-CF1670C. Where is the Pizza?

提交1 通过1
通过率100%
时间限制1000ms
内存限制256MiB

题目描述

题目描述

在寻找披萨的过程中,小 Hosssam 遇到了两个长度为 nn 的排列 aa 和 bb。

回忆一下,排列是一个包含 nn 个互不相同的整数的数组,这些整数从 11 到 nn,顺序任意。例如,[2,3,1,5,4][2,3,1,5,4] 是一个排列,但 [1,2,2][1,2,2] 不是排列(22 在数组中出现了两次),[1,3,4][1,3,4] 也不是排列(n=3n=3,但数组中有 44)。

小 Hosssam 忘记了披萨,开始玩这两个排列。在玩耍的过程中,第一个排列中的一些元素和第二个排列中的一些元素混合在一起,令他惊讶的是,这些元素也组成了一个大小为 nn 的排列。

具体来说,他通过以下方式混合排列,形成了一个新数组 cc:

  • 对于每个 ii(1≤i≤n1\le i\le n),他要么令 ci=aic_i=a_i,要么令 ci=bic_i=b_i。
  • 数组 cc 是一个排列。

你知道排列 aa、bb,以及 cc 中某些位置的值。请计算有多少种不同的排列 cc 满足上述过程和已知的值。由于答案可能很大,请输出对 109+710^9+7 取模的结果。

保证至少存在一个满足所有要求的排列 cc。

输入格式

第一行包含一个整数 tt——测试用例的数量。

每个测试用例的第一行包含一个整数 nn——排列的长度。

接下来一行包含 nn 个互不相同的整数 a1,a2,…,ana_1,a_2,\ldots,a_n——第一个排列。

接下来一行包含 nn 个互不相同的整数 b1,b2,…,bnb_1,b_2,\ldots,b_n——第二个排列。

接下来一行包含 nn 个整数 d1,d2,…,dnd_1,d_2,\ldots,d_n(did_i 要么为 00,要么为 aia_i,要么为 bib_i)——已知的 cc 的部分值。如果 di=0d_i=0,则 cic_i 没有要求。否则,要求 ci=dic_i=d_i。

保证至少存在一个满足所有要求的排列 cc。

输出格式

对于每个测试用例,输出满足条件的不同排列 cc 的数量,对 109+710^9+7 取模。

9
7
1 2 3 4 5 6 7
2 3 1 7 6 5 4
2 0 1 0 0 0 0
1
1
1
0
6
1 5 2 4 6 3
6 5 3 1 4 2
6 0 0 0 0 0
8
1 6 4 7 2 3 8 5
3 2 8 1 4 5 6 7
1 0 0 7 0 3 0 5
10
1 8 6 2 4 7 9 3 10 5
1 9 2 3 4 10 8 6 7 5
1 9 2 3 4 10 8 6 7 5
7
1 2 3 4 5 6 7
2 3 1 7 6 5 4
0 0 0 0 0 0 0
5
1 2 3 4 5
1 2 3 4 5
0 0 0 0 0
5
1 2 3 4 5
1 2 3 5 4
0 0 0 0 0
3
1 2 3
3 1 2
0 0 0
4
1
2
2
1
8
1
2
2

说明 / 提示

在第一个测试用例中,可以通过该过程得到 44 个不同的排列:[2,3,1,4,5,6,7][2,3,1,4,5,6,7],[2,3,1,7,6,5,4][2,3,1,7,6,5,4],[2,3,1,4,6,5,7][2,3,1,4,6,5,7],[2,3,1,7,5,6,4][2,3,1,7,5,6,4]。

在第二个测试用例中,只能得到一个不同的排列:[1][1]。

在第三个测试用例中,可以得到 22 个不同的排列:[6,5,2,1,4,3][6,5,2,1,4,3],[6,5,3,1,4,2][6,5,3,1,4,2]。

在第四个测试用例中,可以得到 22 个不同的排列:[1,2,8,7,4,3,6,5][1,2,8,7,4,3,6,5],[1,6,4,7,2,3,8,5][1,6,4,7,2,3,8,5]。

在第五个测试用例中,只能得到一个不同的排列:[1,9,2,3,4,10,8,6,7,5][1,9,2,3,4,10,8,6,7,5]。

由 ChatGPT 4.1 翻译

1
1
1
1
0
1
1
2
2 1
1 2
0 0
2

数据范围

保证所有测试用例中 nn 的总和不超过 5⋅1055 \cdot 10^5。

(1≤t≤1051 \le t \le 10^5)

(1≤n≤1051\le n\le 10^5)

(1≤ai≤n1\le a_i\le n)

(1≤bi≤n1\le b_i\le n)