//第8回シンデレラガール総選挙は是非本田未央ちゃんに投票をお願いします！
//ファンのことも他のアイドルの子たちのことも本当に大事にしてて、今まで周りに色んなものを与えてくれました。
//今度は私たちが未央ちゃんにお返しをする番です。みんなでガラスの靴を履かせてあげましょう！
// #本田未央を一番星に #本田未央を令和のシンデレラガールに #第8回シンデレラガール総選挙
#include<vector>
#include<cmath>
#include<map>
#include<cstdlib>
#include<iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
#include<stack>
#include<bitset>
#include<functional>
#include<ctime>
#include<queue>
#include<deque>
#include<complex>
#include<cassert>
using namespace std;
#define pb push_back
#define pf push_front
typedef long long lint;
typedef complex<double> P;
#define mp make_pair
#define fi first
#define se second
typedef pair<int,int> pint;
#define All(s) s.begin(),s.end()
#define rAll(s) s.rbegin(),s.rend()
#define REP(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
lint mo=1000000007,ha=(mo+1)/2;
template <class typ> struct BIT{
	vector<typ> x;
	BIT(int n):x(n,0){}
	typ sum(int a,int b){
		if(a>b) return 0;
		if(a==0){
			typ s=0;
			for(int i=b;i>=0;i=(i&(i+1))-1){
				s+=x[i];s%=mo;
			}
			return s;
		}
		else return sum(0,b)-sum(0,a-1);
	}
	void add(int ind,typ f){
		for(int i=ind;i<x.size();i|=i+1){
			x[i]+=f;x[i]%=mo;
		}
	}
};
lint extgcd(lint a, lint b, lint &x, lint &y) {
  lint g = a; x = 1; y = 0;
  if (b != 0) g = extgcd(b, a % b, y, x), y -= (a / b) * x;
  return g;
}
lint invMod(lint a, lint m) {
	if(a==0L) return 0;
  lint x, y;
  if (extgcd(a, m, x, y) == 1) return (x + m) % m;return 0;
}
int a[200100];
vector<int> A;//aをソートしたやつ
lint p[200100],q[200100];
lint pq[200100];// p/qの累積積
lint qp[200100];// q/pの累積積
int lo[200100],hi[200100];//上下それぞれで最も近いq=s0
int main()
{
	int n;cin>>n;
	rep(i,n){
		cin>>a[i];a[i]--;
		A.pb(a[i]);
	}
	sort(All(A));reverse(All(A));
	int now=0,it=0;
	for(int i=n-1;i>=0;i--){
		while(it<n && A[it]==i){
			now++;it++;
		}
		p[i]=now;now--;
	}
	rep(i,n){
		if(p[i]==0L){
			cout<<0<<endl;return 0;
		}
	}
	lint sum=1;
	rep(i,n){
		sum*=p[i];sum%=mo;
		q[i]=p[i]-1;
		//if(q[i]<1) cout<<i<<endl;
	}
	//rep(i,n) cout<<i<<' '<<q[i]<<endl;
	hi[n]=n;
	for(int i=n-1;i>=0;i--){
		hi[i]=hi[i+1];
		if(q[i]<1) hi[i]=i;
	}
	lo[0]=-1;
	rep(i,n){
		if(q[i]<1) lo[i]=i;
		lo[i+1]=lo[i];
	}
	
	lint out=0;
	pq[0]=qp[0]=1;
	rep(i,n){
		pq[i+1]=pq[i]*p[i];
		if(pq[i]<1L) pq[i+1]=p[i];
		pq[i+1]%=mo;
		pq[i+1]*=invMod(q[i],mo);
		pq[i+1]%=mo;
		qp[i+1]=qp[i]*q[i];
		if(qp[i]<1L) qp[i+1]=q[i];
		qp[i+1]%=mo;
		qp[i+1]*=invMod(p[i],mo);
		qp[i+1]%=mo;
	}
	BIT<lint> bit(n+10);
	for(int i=n-1;i>=0;i--){
		lint t=bit.sum(a[i],hi[a[i]]-1)*pq[a[i]+1];
		if(a[i]==hi[a[i]]){
			//cout<<a[i]<<endl;
			t=bit.sum(a[i],hi[a[i]])*pq[a[i]+1];
		}
		//cout<<i<<' '<<t<<endl;
		t%=mo;
		out+=t*ha;out%=mo;
		bit.add(a[i],sum*qp[a[i]+1]%mo);
	}
	//cout<<out<<endl;
	
	BIT<lint> bi2(n+10),bi3(n+10);
	pq[n]=qp[n]=1;
	for(int i=n-1;i>=0;i--){
		pq[i]=pq[i+1]*p[i];
		if(pq[i+1]<1L) pq[i]=p[i];
		pq[i]%=mo;
		pq[i]*=invMod(q[i],mo);
		pq[i]%=mo;
		qp[i]=qp[i+1]*q[i];
		if(qp[i+1]<1L) qp[i]=q[i];
		qp[i]%=mo;
		qp[i]*=invMod(p[i],mo);
		qp[i]%=mo;
	}
	for(int i=n-1;i>=0;i--){
		lint t=bi2.sum(lo[a[i]]+1,a[i]-1)*pq[a[i]+1];
		if(pq[a[i]+1]==0) t=bi2.sum(lo[a[i]]+1,a[i]-1);
		t%=mo;t*=ha;t%=mo;
		//cout<<i<<' '<<t<<' '<<bi3.sum(0,a[i]-1)<<' '<<endl;
		out+=(bi3.sum(0,a[i]-1)*sum-t);
		//out+=t;
		out%=mo;
		bi2.add(a[i],sum*qp[a[i]+1]%mo);
		bi3.add(a[i],1);
	}
	out%=mo;out+=mo;out%=mo;cout<<out<<endl;
}
