#include<algorithm> #include<iostream> #include<cstdio> #include<cctype> #include<vector> #include<cmath> usingnamespace std; constint P=1000000007; constint itwo=P+1>>1; constint ifact=41666667; constint N=100000; inlineintread() { int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f; } int a[N+5],cnt[N+5],f[N+5],g[N+5],pre[N+5],pre_[N+5]; vector<int> list[N+5]; int n,AABB,ABBA,all,ans,T,mx; inlineintC2(int n){return1ll*n*(n-1)%P*itwo%P;} inlineintC4(int n){return1ll*n*(n-1)%P*(n-2)%P*(n-3)%P*ifact%P;} inlineintsqr(int x){return1ll*x*x%P;} inlineintlowbit(int x){return x&-x;} structFenwick_tree { int num[N+5]; voidmodify(int x,int y){for (;x<=n;x+=lowbit(x)) (num[x]+=y)%=P;} intquery(int x) { int ret=0; for (;x;x-=lowbit(x)) (ret+=num[x])%=P; return ret; } }t; voidcalc_AABB() { int sum=0; for (int i=1;i<=mx;++i) pre[i]=0; for (int i=1;i<=n;++i) { (sum+=P-C2(pre[a[i]]++))%=P; (AABB+=1ll*sum*(cnt[a[i]]-pre[a[i]])%P)%=P; (sum+=C2(pre[a[i]]))%=P; } } voidcalc_ABBA() { T=trunc(sqrt(n)); //case 1: LSSL //iterator A's color and the position of B for (int i=1,tmp;i<=mx;++i) if (cnt[i]>T) { for (int j=1;j<=mx;++j) pre[j]=0; tmp=0; for (int j=1;j<=n;++j) if (a[j]==i) ++tmp; elseif (cnt[a[j]]<=T) (ABBA+=1ll*pre[a[j]]*(cnt[i]-tmp)%P)%=P,(pre[a[j]]+=tmp)%=P; } //case 2: SLLS && LLLL //iterator B's color and the postion of A for (int i=1;i<=mx;++i) if (cnt[i]>T) { pre[0]=0; for (int j=1;j<=n;++j) pre[j]=pre[j-1]+(a[j]==i); for (int j=1;j<=mx;++j) f[j]=g[j]=pre_[j]=0; for (int j=1,tmp;j<=n;++j) { if (a[j]==i) continue; tmp=((((1ll*sqr(pre[j])*pre_[a[j]]%P-2ll*pre[j]*f[a[j]]%P+P)%P+f[a[j]])%P+g[a[j]])%P-1ll*pre[j]*pre_[a[j]]%P+P)%P; (ABBA+=1ll*tmp*itwo%P)%=P,(f[a[j]]+=pre[j])%=P,(g[a[j]]+=sqr(pre[j]))%=P; ++pre_[a[j]]; } } //case 3: SSSS for (int i=1;i<=n;++i) { if (cnt[a[i]]>T) continue; int ptr=cnt[a[i]]-1,rg=0; for (;list[a[i]][ptr]>i;--ptr) (ABBA+=t.query(list[a[i]][ptr]))%=P,t.modify(list[a[i]][ptr],-1),++rg; t.modify(i,rg); } for (int i=1;i<=mx;++i) if (cnt[i]<=T) (ABBA+=P-C4(cnt[i]))%=P; } intmain() { freopen("seaarc.in","r",stdin),freopen("seaarc.out","w",stdout); n=read(); for (int i=1;i<=n;++i) ++cnt[a[i]=read()],list[a[i]].push_back(i),mx=max(mx,a[i]); for (int i=1,sum=0,tmp;i<=mx;++i) (all+=1ll*(tmp=C2(cnt[i]))*sum%P)%=P,(sum+=tmp)%=P; calc_AABB(),calc_ABBA(),ans=((all-AABB+P)%P-ABBA+P)%P; printf("%d\n",ans); fclose(stdin),fclose(stdout); return0; }