#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <functional>
#include <set>
#include <map>
#include <cmath>
#define SIZE 200005
#define BT 256*1024*2
#define MOD 1000000007

using namespace std;
typedef long long int ll;
typedef pair <int,int> P;

struct segtree
{
	ll seg[BT],mul[BT];
	int mum;
	
	void init(int n)
	{
		mum=1;
		while(mum<n) mum<<=1;
		for(int i=0;i<mum*2;i++) seg[i]=0,mul[i]=1;
	}
	void pass(int k)
	{
		for(int t=k*2+1;t<=k*2+2;t++)
		{
			mul[t]=mul[t]*mul[k]%MOD;
			seg[t]=seg[t]*mul[k]%MOD;
		}
		mul[k]=1;
	}
	void update(int a,int b,int k,int l,int r,ll x)
	{
		if(b<=l||r<=a) return;
		if(a<=l&&r<=b)
		{
			seg[k]*=x;
			mul[k]*=x;
			seg[k]%=MOD;
			mul[k]%=MOD;
		}
		else
		{
			pass(k);
			update(a,b,k*2+1,l,(l+r)/2,x);
			update(a,b,k*2+2,(l+r)/2,r,x);
			seg[k]=(seg[k*2+1]+seg[k*2+2])%MOD;
		}
	}
	void update(int a,int b,ll x)
	{
		update(a,b,0,0,mum,x);
	}
	ll get(int a,int b,int k,int l,int r)
	{
		if(b<=l||r<=a) return 0;
		if(a<=l&&r<=b) return seg[k];
		else
		{
			pass(k);
			ll vl=get(a,b,k*2+1,l,(l+r)/2);
			ll vr=get(a,b,k*2+2,(l+r)/2,r);
			return (vl+vr)%MOD;
		}
	}
	ll get(int a,int b)
	{
		return get(a,b,0,0,mum);
	}
	void add(int p,ll x)
	{
		int l=0,r=mum,k=0;
		while(r-l>1)
		{
			pass(k);
			int m=(l+r)/2;
			if(p<m)
			{
				r=m;
				k=k*2+1;
			}
			else
			{
				l=m;
				k=k*2+2;
			}
		}
		seg[k]=(seg[k]+x)%MOD;
		while(k>0)
		{
			k=(k-1)/2;
			seg[k]=(seg[k*2+1]+seg[k*2+2])%MOD;
		}
	}
};
segtree seg;
ll inv[SIZE],fac[SIZE],finv[SIZE];
void make()
{
	fac[0]=fac[1]=1;
	finv[0]=finv[1]=1;
	inv[1]=1;
	for(int i=2;i<SIZE;i++)
	{
		inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD;
		fac[i]=fac[i-1]*(ll) i%MOD;
		finv[i]=finv[i-1]*inv[i]%MOD;
	}
}
ll C(int a,int b)
{
	if(a<b) return 0;
	return fac[a]*(finv[b]*finv[a-b]%MOD)%MOD;
}
int A[SIZE];
vector <int> vec[SIZE];
int cnt[SIZE];
int sum[SIZE];
ll all;
int n;

ll solve()
{
	for(int i=1;i<=n;i++) vec[i].clear();
	for(int i=0;i<n;i++) vec[A[i]].push_back(i);
	seg.init(n+2);
	for(int i=n-1;i>=0;i--)
	{
		sum[i]=(int) seg.get(0,A[i]);
		seg.add(A[i],1);
	}
	seg.init(n+2);
	ll now=0;
	ll ret=0;
	for(int i=n;i>=1;i--)
	{
		for(int j=0;j<vec[i].size();j++)
		{
			int v=vec[i][j];
			now-=seg.get(0,v);
			if(now<0) now+=MOD;
			now+=sum[v];
			if(now>=MOD) now-=MOD;
		}
		for(int j=0;j<vec[i].size();j++)
		{
			int v=vec[i][j];
			seg.add(v,1);
		}
		ret+=all*now%MOD*inv[cnt[i]]%MOD;
		if(ret>=MOD) ret-=MOD;
		now=now*(ll) (cnt[i]-1)%MOD;
		now=now*inv[cnt[i]]%MOD;
		seg.update(0,seg.mum,(ll) (cnt[i]-1)*inv[cnt[i]]%MOD);
	}
	return ret;
}
int main()
{
	make();
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		int a;
		scanf("%d",&a);
		A[i]=a;
	}
	for(int i=0;i<n;i++) cnt[A[i]]++;
	for(int i=n-1;i>=1;i--) cnt[i]+=cnt[i+1];
	all=1;
	for(int i=1;i<=n;i++)
	{
		if(cnt[i]<=n-i)
		{
			puts("0");
			return 0;
		}
		cnt[i]-=n-i;
		all=all*(ll) cnt[i]%MOD;
	}
	ll ret=(ll) n*(ll) (n-1)/2LL;
	ret%=MOD;
	ret*=all;
	ret%=MOD;
	ret+=solve();
	if(ret>=MOD) ret-=MOD;
	for(int l=0,r=n-1;l<r;l++,r--) swap(A[l],A[r]);
	ret-=solve();
	//printf("%lld\n",solve());
	if(ret<0) ret+=MOD;
	if(ret%2==1) ret+=MOD;
	printf("%lld\n",ret/2);
	return 0;
}
