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;
}

京公网安备 11010502036488号