1 solutions

  • 0
    @ 2023-10-29 14:12:34

    最大值一定在中间,所以你只需要决定其余的数放在最大数的左边还是右边,那么假如某个数出现的次数为x,并且不是最大的数,那么就可以选择放在左边的个数范围为[0,x],对应的右边的个数为[x,0],总共x+1种选择,因此序列的合法个数就是非最大值的数的个数加1再相乘 新生可以自己查查map怎么用,这也是经常用到的

    #include <bits/stdc++.h>
    using namespace std;
    #define accelerate ios::sync_with_stdio(false),cin.tie(0);
    #define int long long
    #define PII pair<int,int>
    #define INF 0x3f3f3f3f
    #define fi first
    #define se second
    #define ufor(i,st,en) for(int i=st;i<=en;i++)
    #define dfor(i,en,st) for(int i=en;i>=st;i--)
    #define mp(x,y) make_pair(x,y)
    #define pb(x) emplace_back(x)
    #define vi vector<int>
    #define vii vector<vi>
    #define RE return 0
    const int N=2e5+1000,mod=998244353;
    int n,m,k,T,z,q;
    //int d[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int dx[]={0,0,-1,0,1},dy[]={0,-1,0,1,0};
    void fixd(int x){
        cout<<setiosflags(ios::fixed)<<setprecision(x);
    }
    int mp[1000000];
    void solve(){
    	cin>>n;int x,Max=-INF;
    	map<int,int>mp;
    	for(int i=1;i<=n;i++){
    		cin>>x;mp[x]++;
    		Max=max(Max,x);
    	}
    	int ans=1;
    	for(int i=1;i<Max;i++){
    		ans=ans*(mp[i]+1)%mod;
    	}
    	cout<<ans<<"\n"; 
    }
    signed main(){
        accelerate;
        T=1;
        while(T--){
        	solve();
    	}
        return 0;
    }

    Information

    ID
    6941
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    6
    Tags
    # Submissions
    58
    Accepted
    3
    Uploaded By