题目:
思路分析:
可以手动模拟一下过程
代码实现:
/*
*@Author: GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
* __----~~~~~~~~~~~------___
* . . ~~//====...... __--~ ~~
* -. \_|// |||\\ ~~~~~~::::... /~
* ___-==_ _-~o~ \/ ||| \\ _/~~-
* __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~
* _-~~ .=~ | \\-_ '-~7 /- / || \ /
* .~ .~ | \\ -_ / /- / || \ /
* / ____ / | \\ ~-_/ /|- _/ .|| \ /
* |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\
* ' ~-| /| |-~\~~ __--~~
* |-~~-_/ | | ~\_ _-~ /\
* / \ \__ \/~ \__
* _--~ _/ | .-~~____--~-/ ~~==.
* ((->/~ '.|||' -_| ~~-/ , . _||
* -_ ~\ ~~---l__i__i__i--~~_/
* _-~-__ ~) \--______________--~~
* //.-~~~-~_--~- |-------~~~~~~~~
* //.-~~~--\
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 神兽保佑 永无BUG
*/
//--组合数学--
const int Cmod = 998244353;
ll fac[1000100],inv[1000100];
int power(int a,int b)
{
int ret;
if (b==0) return 1;
ret=power(a,b/2);
ret=1ll*ret*ret%Cmod;
if (b%2)ret=1ll*ret*a%Cmod;
return ret;
}
void pre(){
fac[0]=1;inv[0]=1;
for(int i=1;i<=1000000;i++)
{
fac[i]=1ll*fac[i-1]*i%Cmod;
inv[i]=power(fac[i],Cmod-2);
}
}
int C(int n,int m) //组合数的计算
{
if (n<m) return 0;
if (n<0||m<0) return 0;
return 1ll*fac[n]*inv[m]%Cmod*inv[n-m]%Cmod;
}
//----------
const int MAX=1e6+10;
int cnt[MAX];
int f[MAX];
int sum[MAX];
void solve(){
int n;
cin>>n;
int flag=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
cnt[x]++;
}
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+cnt[i];
}
for(int i=1;i<=n;i++){
if(!cnt[i]){
f[i]=f[i-1];
continue;
}
if(!flag){
flag=1;
f[i]=1;
for(int j=2;j<=cnt[i];j++){
f[i]=(f[i]*j)%Cmod;
}
continue;
}
f[i]=f[i-1]*C(sum[i-1]+cnt[i]/2,cnt[i]/2)%Cmod;
for(int j=2;j<=cnt[i];j++){
f[i]=(f[i]*j)%Cmod;
}
}
cout<<f[n]<<endl;
}
int n;
int main(){
pre();
solve();
}