#include<iostream>
#include<cstring>
#include<cstdio>
#define int long long
using namespace std;

const int mo=1e9+7;

int n,a[200001],tree[200001],tree1[200001],d[200001],cnt[200001];
int zero[200001],pos[200001];

int get(int o) {int yu=0;for(int i=o;i>=1;i-=(-i)&i) yu=(yu+tree[i])%mo;return yu;}

int get1(int o) {int yu=0;for(int i=o;i>=1;i-=(-i)&i) yu+=tree1[i];return yu;}

void put(int o,int p){for(int i=o;i<=n;i+=(-i)&i) tree[i]=(tree[i]+p)%mo,tree1[i]++;}

int mi(int o,int p)
{
	int u=1;
	while(p>0)
	{
		if(p&1) u=1ll*u*o%mo;
		o=1ll*o*o%mo;
		p>>=1;
	}
	return u;
}

signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++) put(a[i],1);
	for(int i=1;i<=n;i++) cnt[i]=get1(n)-get1(i-1);
	int S=1;
	for(int i=1;i<=n;i++) 
	{
		if((cnt[i]-n+i)<=0) {cout<<0<<endl;return 0;}
	    S=1ll*S*(cnt[i]-n+i)%mo;
	}
	pos[0]=1;d[0]=1;
	for(int i=1;i<=n;i++)
	{
		int yu=1ll*(cnt[i]-n+i-1)*mi(cnt[i]-n+i,mo-2)%mo;
		if(yu==0) {pos[zero[i]=(zero[i-1]+1)]=i;d[i]=d[i-1];}else 
		{d[i]=1ll*d[i-1]*yu%mo;zero[i]=zero[i-1];}
	}
	memset(tree,0,sizeof(tree));
	memset(tree1,0,sizeof(tree1));
	int ans=0;
	for(int i=1;i<=n;i++)
	{
	    ans+=1ll*d[a[i]]*((get(a[i])-get(pos[zero[a[i]]]-1)+mo)%mo)%mo*mi(2,mo-2)%mo*S%mo;
	    ans%=mo;
	    put(a[i],mi(d[a[i]],mo-2));
	}
	memset(tree,0,sizeof(tree));
	memset(tree1,0,sizeof(tree1));
	for(int i=n;i>=1;i--)
	{
		ans-=1ll*d[a[i]]*((get(a[i]-1)-get(pos[zero[a[i]]]-1)+mo)%mo)%mo*mi(2,mo-2)%mo*S%mo;
		ans=(ans+mo)%mo;
		ans+=1ll*get1(a[i]-1)*S%mo;
		ans%=mo;
		put(a[i],mi(d[a[i]],mo-2));
	}
	cout<<ans<<endl;
	return 0;
}