思想
首先我们需要找到最大值,然后我们再对其他值做乘法原理.
拿样例举例:
样例1
我们先找出最大值3,然后还有2个2.我们可以让这2个2全部放3的最右边,整体呈严格递增趋势,也可以把所有2全部放在3的右边,整体呈严格递减趋势.也可以把1个2放3左边,另一个2放3右边,整体呈先严格递增,后严格递减趋势,一共就有3种排列:
样例2
首先我们找到最大值5,还剩3个2,2个1.我们先看2个1有多少种排列:
再看3个2有多少种排列:
一共就有3*4种排列.
我们可以发现规律:
每个数能有多少种合法排列=除最大值外元素1出现次数+1 * 除最大值外元素2出现次数+1+.......
code
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e5+10;
const int mod=998244353;
int cnt[N];
int maxn=-INF;
int ans=1;
signed main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
int x;cin>>x;
cnt[x]++;
maxn=max(maxn,x);
}
for(int i=1;i<maxn;i++)
{
if(cnt[i])
{
ans=ans*(cnt[i]+1)%mod;
}
}
cout<<ans;
return 0;
}