本题的关键在于b中的最小值b_min。为了让a得到尽可能高的分数,应将b_min排在第一位,此时对于a中的牌来说,大于b_min则可得一分,小于b_min则不能得分。所以对于a来说可分为两段:大于b_min和小于b_min。那么组合个数就是这两段的阶乘之积。 下面是代码:
#include<bits/stdc++.h>
#define int long long
int a[200005],b[200005];
using namespace std;
signed main(){
int T;
cin>>T;
while(T--){
int n,mn=2e9,x=0,y=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
mn=min(mn,b[i]);
}
for(int i=1;i<=n;i++){
if(a[i]>mn)x++;
else y++;
}
int ans=1;
for(int i=1;i<=x;i++){
ans=(ans*i)%998244353;
}
for(int i=1;i<=y;i++){
ans=(ans*i)%998244353;
}
cout<<ans<<endl;
}
}

京公网安备 11010502036488号