B题

题意: 小苯玩卡牌游戏,一共有2*n张牌,将这牌平分,只要有一人没牌就结束了,他们先比第一张牌,大的那个人+1分并且移除不用。游戏过程如上,现在你可以在游戏开始前任意重排 以得到最大的得分,问有多少种重排的方式可以使得得分取到可能的最大值。

题解: 咱们设小苯的牌为a,小红的牌为b。为了a得最多的分,我们可以将a从大到小排列,我们模拟一遍会发现,如果b中的最小牌大于a中的其中几个为m,那这其中几个肯定不会加分,就可以进行这几个排列,他们排列的个数为m!(阶乘)。同理,大于b的最小牌个数为n,他们的排列为n!。总个数就是(m!*n!)%MOD;

代码

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LLINF = 0x3f3f3f3f3f3f3f3f;
const int MOD = 998244353;
const int MAXN = 2e5+10;
inline void optimizeIO() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
}
long long jc(int a) {
	long long s = 1;
	for (int i = 1; i <= a; i++)
		s =(s*i)%MOD;
	return s;
}
int main() {
	optimizeIO();
	int t;
	cin >> t;
	while (t--) {
		int n, x;
		cin >> n;
		int min1 = 2e9;
		vector<int>a(n);
		for (int i = 0; i < n; i++)
			cin >> a[i];
		for (int i = 0; i < n; i++) {
			cin >> x;
			min1 = min(min1, x);
		}
		int k = 0;
		for (int i = 0; i < n; i++)
			if (min1 < a[i])
				k++;
		cout << (jc(k)*jc(n - k))%MOD << endl;
	}
	return 0;
}