一道组合数学的问题,一开始想的是改变最大值的位置然后分类计算,但那样太麻烦。不从最大值下手,除最大值以外的每一个数都有道最大值左边和右边两种选择。而如果有相同的可以将其看成一个一起,首先将他们插空分隔就可以得到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; }