一道组合数学的问题,一开始想的是改变最大值的位置然后分类计算,但那样太麻烦。不从最大值下手,除最大值以外的每一个数都有道最大值左边和右边两种选择。而如果有相同的可以将其看成一个一起,首先将他们插空分隔就可以得到N+1中左右分配的方案。然后全部相乘即可。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 1e5+10;
const int p = 998244353;
int a[maxn];
map<int, int> mp;
int main() {
int T, k;
cin>>T;
while (T--) {
mp.clear();
int n;
ll res = 1;
int mx = INT_MIN;
cin>>n;
for (int i=0;i<n;i++) {
cin>>k;
mp[k]++;
mx = max(mx, k);
}
map<int,int>::iterator it = mp.begin();
for (;it!=mp.end();it++) {
if (mx!=it->first) {
res = ((res%p)*((it->second+1)%p))%p;
}
}
cout<<res<<endl;
}
return 0;
}

京公网安备 11010502036488号