Card Game
题号:NC301580
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}小苯正在和小红玩卡牌游戏。游戏中有 2\times n 张牌,每张牌上都有一个数字,所有牌的数字恰好构成了一个长度为 2\times n排列
\hspace{15pt}游戏最初时,2\times n 张卡牌被恰好平均分成了两组 n 张牌,并分别发给了两人,小苯第 i 张牌上的数字是 a_i,而小红第 i 张牌上的数字是 b_i,具体的游戏过程如下:
\hspace{23pt}\bullet\,如果两人之中有一人已经没有牌了,则游戏结束。
\hspace{23pt}\bullet\,比较两人当前手牌中的最前一张,对应数字大的那一方得一分并将该张牌从自己手牌移除;另一方不得分,手牌也不变。随后进入下一轮。

\hspace{15pt}而现在小苯希望自己的得分尽可能多,为此他在游戏开始前可以任意地重新排列自己的牌,以得到更高的游戏分数。
\hspace{15pt}现在你的任务则是求出,有多少种重新排列(选择不进行重排也是一种方案)的方式,能使得小苯得到他能得到的最高分。由于答案可能很大,请将答案对 998\,244\,353 取模后输出。

【名词解释】
\hspace{15pt}长度为 n排列:由 1,2,\dots,nn 个整数、按任意顺序组成的数组(每个整数均恰好出现一次)。例如,\{2,3,1,5,4\} 是一个长度为 5 的排列,而 \{1,2,2\}\{1,3,4\} 都不是排列,因为前者存在重复元素,后者包含了超出范围的数。

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leqq T\leqq 10^5\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行输入一个正整数 n\left(1 \leqq n \leqq 2 \times 10^5\right),表示两人的卡牌数量。
\hspace{15pt}第二行输入 n 个正整数 a_1,a_2,\dots,a_n\left(1 \leqq a_i \leqq 2 \times n\right),表示小苯的卡牌上的数字。
\hspace{15pt}第三行输入 n 个正整数 b_1,b_2,\dots,b_n\left(1 \leqq b_i \leqq 2\times n\right),表示小红的卡牌上的数字。
\hspace{15pt}(保证 a 数组和 b 数组共同构成一个长度为 2\times n 的排列。)

\hspace{15pt}除此之外,保证单个测试文件的 n 之和不超过 2 \times 10^5

输出描述:

\hspace{15pt}对于每一组测试数据,新起一行输出一个整数,表示小苯重新排列自己卡牌,使得他能得到的最高分的方案数对 998\,244\,353 取模后的值。
示例1

输入

复制
3
2
1 2
3 4
4
1 8 7 2
3 6 4 5
5
9 8 2 3 1
10 7 5 6 4

输出

复制
2
4
12

说明

\hspace{15pt}对于第一组测试数据,无论小苯如何重排他的卡牌,他的最高得分总是 0,而 \{1,2\}\{2,1\} 两种重排方式都能使得他得到最高分,因此输出 2