题意:小苯和小红各有 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;
}

京公网安备 11010502036488号