链接

#include<iostream>
#include<vector>

using namespace std;
using ll = long long;

void solve(){
    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> b(n);
    for(int i = 0; i < n; i ++) cin >> a[i];
    for(int i = 0; i < n; i ++) cin >> b[i];
    ll min_b = 2 * n, count_max = 0, count_min = 0;
    for(int i = 0; i < n; i ++){
        if(b[i] < min_b) min_b = b[i];
    }
    for(int i = 0; i < n; i ++){
        if(a[i] > min_b) count_max++;
        else count_min++;
    }
    
//     ll result = 1; //result_max = 1, result_min = 1;
//     for(int i = 1; i <= count_max; i ++)
//         result = (result * i) % 998244353;
//     for(int i = 1; i <= count_min; i ++)
//         result = (result * i) % 998244353;
//     // result = (result_max * result_min) % 998244353;
//     //cout << min_b << " " << count_max << " " << count_min << " " << endl;
    
//     // result = result % 998244353; 有没有都可以
    
//     cout << result << endl;

    ll result = 1, result_max = 1, result_min = 1;
    for(int i = 1; i <= count_max; i ++)
        result_max = (result_max * i) % 998244353;
    for(int i = 1; i <= count_min; i ++)
        result_min = (result_min * i) % 998244353;
    result = (result_min * result_max) % 998244353;
    cout << result << endl;
    
}

int main(){
    int t;
    cin >> t;
    while(t --){
        solve();
    }
}


每一次没有出去的牌会进行下一次的比较,也就是说如果小苯的一张小牌在前的话,那么有可能会挡住所有的其他大牌,所以理论上讲,小苯得分最多的情况就是将所有的大于小红最小的牌的牌全部打出,也就是以小红的最小的牌为界,小苯大于此牌的牌在前面,其他的牌在后面,就是m! * n!再取模。