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