题意:小苯和小红各有 n 张牌(共 2n 张),游戏规则: 两人每次出最前一张牌,数字大的一方得 1 分并将这张牌移除,对方牌不变; 若一方无牌则游戏结束。

题目让小苯的分尽量大,翻译一下就是小苯要从大到小出牌,把最大牌早出就不会被卡,不用管小红的牌,举几个例子就可以看出在从大到小排的方式下,有多个下于红最小的牌就是最后被卡住的牌数x,最高的得分就是大于红最小牌的个数y,排序数就是x!*y!

using namespace std;
//#define int long long
#define endl '\n'
const long long MOD=998244353;
long long as(long long num)
{
    long long z=1;
    for(long long i=num;i>=1;i--)
    {
        z*=i;
        z%=MOD;//不加会溢出
    }
    return z;
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    long long t;
    cin>>t;
    for(long long i=0;i<t;i++)
    {
        long long n;
        cin>>n;
        vector<long long> a(n);
        vector<long long> b(n);
        for(long long j=0;j<n;j++)
        {
            cin>>a[j];
        }
        for(long long j=0;j<n;j++)
        {
            cin>>b[j];
        }
        //sort(a.begin(),a.end(),greater<long long>());
        sort(b.begin(),b.end());//算出红最低的牌
        long long sum=0;
        for(long long j=0;j<n;j++)
        {
            if(a[j]>b[0])
            {
                sum++;
            }
        }
        long long mm=(as(sum)%MOD*as(n-sum)%MOD)%MOD;
        cout<<mm<<endl;
    }
    return 0;
}