#include <cstdio>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

typedef long long ll;

int read() {
	char ch;
	for(ch=getchar();ch<'0'||ch>'9';ch=getchar());
	int x=ch-'0';
	for(ch=getchar();ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x;
}

const int N=2e5+5,Mo=1e9+7,i2=Mo+1>>1;

int pwr(int x,int y) {
	int z=1;
	for(;y;y>>=1,x=(ll)x*x%Mo)
		if (y&1) z=(ll)z*x%Mo;
	return z;
}

int n,s,a[N],cnt[N],val[N],tr[N],Mx[N],pre[N];

void C() {fo(i,1,n) tr[i]=0;}
void I(int x,int y) {for(;x<=n;x+=x&-x) (tr[x]+=y)%=Mo;}
int Q(int x) {int r=0;for(;x;x-=x&-x) (r+=tr[x])%=Mo;return r;}

int calc(int l,int r) {
	if (Mx[l]==Mx[r]&&Mx[l]) return (ll)s*pre[r]%Mo*pwr(pre[l-1],Mo-2)%Mo;
	return 0;
}

int main() {
	n=read();
	fo(i,1,n) cnt[a[i]=read()]++;
	fd(i,n,1) cnt[i]+=cnt[i+1];
	int ans=0;s=1;
	fo(i,1,n) s=(ll)s*(cnt[i]-n+i)%Mo;
	if (!s) {puts("0");return 0;}
	fo(i,1,n) val[i]=(ll)(cnt[i]-n+i-1)*pwr(cnt[i]-n+i,Mo-2)%Mo;
	int la=n;
	fd(i,n,1) {
		if (!val[i]) {
			pre[i]=1;
			fo(j,i+1,la) pre[j]=(ll)pre[j-1]*val[j]%Mo;
			la=i-1;
		} else Mx[i]=la;
	}
	fd(i,n,1) {
		(ans+=(ll)s*Q(a[i]-1)%Mo)%=Mo;
		I(a[i],1);
	}
	C();
	fo(i,1,n) {
		if (val[a[i]+1]) {
			int ret=(Q(Mx[a[i]])-Q(a[i])+Mo)%Mo;
			(ans-=(ll)s*ret%Mo*pwr(pre[a[i]],Mo-2)%Mo*i2%Mo)%=Mo;
		}
		I(a[i],pre[a[i]]);
	}
	C();
	fd(i,n,1) {
		if (val[a[i]+1]) {
			int ret=(Q(Mx[a[i]])-Q(a[i])+Mo)%Mo;
			(ans+=(ll)s*ret%Mo*pwr(pre[a[i]],Mo-2)%Mo*i2%Mo)%=Mo;
		}
		I(a[i],pre[a[i]]);
	}
	fo(i,1,n) cnt[i]=0;
	fo(i,1,n) cnt[a[i]]++;
	fo(i,1,n) (ans+=(ll)s*cnt[i]%Mo*(cnt[i]-1)%Mo*i2%Mo*i2%Mo)%=Mo;
	printf("%d\n",(ans+Mo)%Mo);
	return 0;
}