// Original C++ solution (slower):
#include <vector>

#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;



void mod(int &x) {x=x>=Mo?x-Mo:x;}

void inc(int &x,int y) {x=x+y>=Mo?x+y-Mo:x+y;}



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,ql,qr,tmp,a[N],cnt[N],t[N],tag[N<<2],tr[N<<2];

vector<int> p[N];



void Ins(int x) {for(;x<=n;x+=x&-x) t[x]++;}

int Que(int x) {int res=0;for(;x;x-=x&-x) res+=t[x];return res;}



void mult(int v,int z) {

	tr[v]=(ll)tr[v]*z%Mo;

	tag[v]=(ll)tag[v]*z%Mo;

}



void down(int v) {

	if (tag[v]!=1) {

		mult(v<<1,tag[v]);

		mult(v<<1|1,tag[v]);

		tag[v]=1;

	}

}



void ins(int v,int l,int r,int x) {

	if (l==r) {tr[v]=tmp;return;}

	int mid=l+r>>1;down(v);

	if (x<=mid) ins(v<<1,l,mid,x);

	else ins(v<<1|1,mid+1,r,x);

	mod(tr[v]=tr[v<<1]+tr[v<<1|1]);

}



int query(int v,int l,int r) {

	if (ql<=l&&r<=qr) return tr[v];

	int mid=l+r>>1;down(v);

	int sum=0;

	if (ql<=mid) inc(sum,query(v<<1,l,mid));

	if (qr>mid) inc(sum,query(v<<1|1,mid+1,r));

	return sum;

}



int main() {

	n=read();

	fo(i,1,n) {

		a[i]=read();

		cnt[a[i]]++;

		p[a[i]].push_back(i);

	}

	fd(i,n,1) cnt[i]+=cnt[i+1];

	int sum=1,inv=pwr(2,Mo-2);

	fo(i,1,n) {

		if (cnt[i]-n+i<0) {puts("0");return 0;}

		sum=(ll)sum*(cnt[i]-n+i)%Mo;

	}

	tmp=(ll)sum*inv%Mo;

	fo(i,1,n<<2) tag[i]=1;

	int ans=0;

	fd(i,n,1) {

		if (!p[i].empty()) {

			int sz=p[i].size();

			fo(j,0,sz-1) {

				int x=p[i][j];

				ql=x;qr=n;inc(ans,query(1,1,n));

				inc(ans,(ll)sum*Que(x)%Mo);

				ql=1;qr=x;inc(ans,Mo-query(1,1,n));

				ins(1,1,n,x);Ins(x);

			}

		}

		mult(1,(ll)(cnt[i]-n+i-1)*pwr(cnt[i]-n+i,Mo-2)%Mo);

	}

	printf("%d\n",ans);

	return 0;

}

// Optimized solution to the same problem (faster):
#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;

}

// Fastest known solution for this problem: