/*
开一个桶a,统计对应长度的木棍的数量
读入的过程计算最大值max
然后数据全部读入过后再开一个数组temp每一位计算从a[1]加到a[n]的值
然后从1到max用i循环,每次方案数都加C(a[i],2)%mod*(temp[i*2-1]-2)%mod
但是当所有木棍长度都相同时 方案数就是C(n,3)
*/
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
int a[200010],temp[200010];
long long c[200010];
long long an=0,zl=0;
int max1=-100;
long long fac(int m)//求m的阶乘
{
long long ans=1;
for(int i=1;i<=m;i++) ans=ans*i%mod;
return ans;
}
long long C(int n,int m)//从n项中选出m项
{
c[n]=fac(n)/(fac(n-m)*fac(m));
return c[n];
}
int main()
{
int n,last;cin>>n;
bool same=1;
for(int i=1;i<=n;i++)
{
int k;cin>>k;
a[k]++;//桶
max1=max(k,max1);//打擂求最大
if(i==1) last=k;
else
{
if(last!=k) same=0;
}//判别是否所有木棍长度都相同
}
long long qzh=0;
for(int i=1;i<=200010;i++)
{
qzh+=a[i];
temp[i]=qzh;
}//前缀和处理
if(same==0){
for(int i=1;i<=max1;i++)
{
if(temp[i*2-1]-2<0) zl=0;
else
{
if(a[i]>=3){
zl=C(a[i],2)%mod*(temp[i*2-1]-a[i])%mod+1;
}
else{
zl=C(a[i],2)%mod*(temp[i*2-1]-2)%mod;
}
}
an+=zl;
}//公式,但是所有的等边三角形只能取一个
}
else{
an=C(n,3)%mod;
}//特判
cout<<an;
return 0;
}
样例都调过了但是还是不知道为什么全错