代码
思路
- 这是一道排列组合题,稍微推一下公式就能求出,主要是要用到逆元,组合数等方法求解
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
ll jc[200005], in[200005];
ll ksm(ll a, ll b) {
ll ans = 1;
while (b) {
if (b & 1)
ans *= a, ans %= mod;
a *= a;
a %= mod;
b >>= 1;
}
return ans;
}
ll C(ll n, ll m) {
if (n == 0 || n == m)
return 1;
return jc[m] * in[n] % mod * in[m - n] % mod;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
jc[0] = 1;
jc[1] = 1;
in[1] = 1;
for (int i = 2; i < 200005; i++) {
jc[i] = jc[i - 1] * i % mod;
in[i] = ksm(jc[i], mod - 2);
}
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
ll a[n];
ll maxx = 0;
int cnt = 0, temp, cnt1 = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
if (maxx < a[i]) {
maxx = a[i], temp = i;
}
}
for (int i = 0; i < n; i++) {
if (maxx - a[i] <= 1)
cnt++;
if (maxx == a[i])
cnt1++;
}
if (cnt1 > 1) {
cout << jc[n] << endl;
continue;
}
if (cnt == 1) {
cout << 0 << endl;
continue;
}
ll num = n - cnt;
ll ans = jc[n];
for (int i = 0; i <= num; i++) {
ans =
(ans + mod - (C(i, num) * jc[i] % mod) * jc[n - 1 - i] % mod) %
mod;
}
cout << ans << endl;
}
}