#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define db double
#define LL long long
#define inf 0x3f3f3f3f
#define N 200005
using namespace std;
int gi()
{
    int res=0,s=1; char ch;
    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    if(ch=='-') s=-1,ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) res=res*10+ch-48;
    return res*s;
}

const int mo=1000000007;
int n,A[N],last[N],tr[N],cnt[N],D[N],mul[N],S=1,ans,sum;

LL qp(LL x,LL y) {
    LL res=1;
    for(;y;y>>=1,x=x*x%mo)
	if(y&1) res=res*x%mo;
    return res;
}
//BIT
int lb(int x) {return x&-x;}
void add(int x,int v) {
    for(;x<=n;x+=lb(x))
	tr[x]+=v,tr[x]>=mo?tr[x]-=mo:0;
}
int ask(int x) {
    int res=0;
    for(;x;x-=lb(x))
	res+=tr[x],res>=mo?res-=mo:0;
    return res;
}
int main()
{
    n=gi();
    for(int i=1;i<=n;++i) A[i]=gi();
    //PRE
    for(int i=1;i<=n;++i) add(A[i],1);
    for(int i=1;i<=n;++i) {
	cnt[i]=(ask(n)-ask(i-1))-(n-i),S=1ll*S*(cnt[i]<=0 ? 0 : cnt[i])%mo;
	if(cnt[i]>0) D[i]=1ll*(cnt[i]-1)*qp(cnt[i],mo-2)%mo;
	if(D[i]) last[i]=last[i-1],mul[i]=1ll*(D[i-1] ? mul[i-1] : 1)*D[i]%mo;
	else last[i]=i,mul[i]=0;
    }
    if(!S) {printf("0\n"); return 0;}
    //PART1
    memset(tr,0,sizeof(tr));
    for(int i=1;i<=n;++i) {
	ans+=1ll*(ask(A[i])-ask(last[A[i]])+mo)%mo*mul[A[i]]%mo*S%mo,ans>=mo?ans-=mo:0;
	add(A[i],qp(mul[A[i]],mo-2));
    }
    ans=1ll*ans*qp(2,mo-2)%mo;
    //PART2
    memset(tr,0,sizeof(tr));
    for(int i=1;i<=n;++i) {
	ans+=1ll*(i-1-ask(A[i]))*S%mo,ans>=mo?ans-=mo:0;
	add(A[i],1);
    }
    memset(tr,0,sizeof(tr));
    for(int i=n;i;--i) {
	if(last[A[i]]==A[i]) continue;
	sum+=1ll*(ask(A[i]-1)-ask(last[A[i]])+mo)%mo*mul[A[i]]%mo*S%mo,sum>=mo?sum-=mo:0;
	add(A[i],qp(mul[A[i]],mo-2));
    }
    sum=1ll*sum*qp(2,mo-2)%mo;
    ans-=sum,ans<0?ans+=mo:0;
    printf("%d\n",ans);
    return 0;
}
