#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>

#define _overload(_1,_2,_3,name,...) name
#define _rep(i,n) _range(i,0,n)
#define _range(i,a,b) for(int i=int(a);i<int(b);++i)
#define rep(...) _overload(__VA_ARGS__,_range,_rep,)(__VA_ARGS__)

#define _rrep(i,n) _rrange(i,n,0)
#define _rrange(i,a,b) for(int i=int(a)-1;i>=int(b);--i)
#define rrep(...) _overload(__VA_ARGS__,_rrange,_rrep,)(__VA_ARGS__)

#define _all(arg) begin(arg),end(arg)
#define uniq(arg) sort(_all(arg)),(arg).erase(unique(_all(arg)),end(arg))
#define getidx(ary,key) lower_bound(_all(ary),key)-begin(ary)
#define clr(a,b) memset((a),(b),sizeof(a))
#define bit(n) (1LL<<(n))
#define popcount(n) (__builtin_popcountll(n))

using namespace std;

template<class T>bool chmax(T &a, const T &b) { return (a<b)?(a=b,1):0;}
template<class T>bool chmin(T &a, const T &b) { return (b<a)?(a=b,1):0;}

using ll=long long;

class ModInt {
public:
	static unsigned MOD;
	ModInt(): x(0) {}
	ModInt(signed y) : x(y >= 0 ? y % MOD : MOD - (-y) % MOD) {}
	ModInt(signed long long y) : x(y >= 0 ? y % MOD : MOD - (-y) % MOD) {}


	// Arithmetic Oprators
	ModInt &operator+=(ModInt that) {
		if ((x += that.x) >= MOD) x -= MOD; 
		return *this;
	}

	ModInt &operator-=(ModInt that) {
		if ((x += MOD - that.x) >= MOD) x -= MOD; 
		return *this;
	}
	ModInt &operator*=(ModInt that) {
		x = 1LL * x * that.x % MOD;
		return *this;
	}

	ModInt &operator+=(const int that) { return *this += ModInt(that);}
	ModInt &operator-=(const int that) { return *this -= ModInt(that);}
	ModInt &operator*=(const int that) { return *this *= ModInt(that);}

	// Comparators
	bool operator <(ModInt that) { return x < that.x; }
	bool operator >(ModInt that) { return x > that.x; }
	bool operator<=(ModInt that) { return x <= that.x; }
	bool operator>=(ModInt that) { return x >= that.x; }
	bool operator!=(ModInt that) { return x != that.x; }
	bool operator==(ModInt that) { return x == that.x; }

	// Utilities
	unsigned getval() const { return x;}
	ModInt operator+(ModInt that) const { return ModInt(*this) += that;}
	ModInt operator-(ModInt that) const { return ModInt(*this) -= that;}
	ModInt operator*(ModInt that) const { return ModInt(*this) *= that;}
	ModInt operator+(const int that) const { return ModInt(*this) += that;}
	ModInt operator-(const int that) const { return ModInt(*this) -= that;}
	ModInt operator*(const int that) const { return ModInt(*this) *= that;}
	ModInt operator=(const int that) { return *this = ModInt(that);}
	friend istream &operator>>(istream& is, ModInt &that) {ll tmp; is >> tmp; that = ModInt(tmp);return is;}
	friend ostream &operator<<(ostream& os, const ModInt &that) { return os << that.x; }
	
	ModInt power(ll n) const {
		ll b = 1LL, a = x;
		while(n){
			if(n & 1) b = b * a % MOD;
			a = a * a % MOD;
			n >>= 1;
		}
		return ModInt(b);
	}

	ModInt inv() const {
		ll n = MOD - 2, b = 1LL, a = x;
		while(n){
			if(n & 1) b = b * a % MOD;
			a = a * a % MOD;
			n >>= 1;
		}
		return ModInt(b);
	}
private:
	unsigned x;
};

unsigned ModInt::MOD = 1000000007;
using mint = ModInt;
const mint ZERO = mint(0);
const mint ONE = mint(1);
const mint TWO = mint(2);

template <int depth> struct Binary_indexed_tree {
	using T = mint;

	const static int h = depth;
	const static int n = 1 << h;
	T data[n];

	void init() {
		fill_n(data, n, ZERO);
	}

	void update(int i, T x) {
		for (i++; i < n; i += i & -i) {
			data[i] += x;
		}
	}

	T query(int i) {
		T ret = 0;
		for (i++; i > 0; i -= i & -i) ret += data[i];
		return ret;
	}
};


int main(void){
	int n;
	cin >> n;
	
	vector<int> a(n);
	vector<int> c(n + 1, 0);
	
	rep(i, n) {
		cin >> a[i];
		c[a[i]]++;
	}

	rrep(i, n, 1) {
		c[i] += c[i + 1];
	}

	rep(i, 1, n + 1) {
		c[i] -= n - i;
	}

	mint s = ONE;

	rep(i, 1, n + 1) {
		if (c[i] <= 0) {
			puts("0");
			exit(0);
		}

		s *= mint(c[i]);
	}


	mint ans = ZERO;

	vector<int> z(n + 1, 0);
	vector<mint> d(n + 1, ZERO);
	Binary_indexed_tree<18> dsum, dinvsum, anum;

	d[0] = ONE;

	rep(i, 1, n + 1) {
		z[i] = z[i - 1];	
		d[i] = d[i - 1];

		if (c[i] == 1) {
			z[i]++;
		} else {
			d[i] *= mint(c[i] - 1) * (mint(c[i]).inv());
		}
	}


	rep(i, n) {
		const int from = lower_bound(begin(z) + 1, end(z), z[a[i]]) - begin(z);
		ans += s * d[a[i]] * (dinvsum.query(a[i]) - dinvsum.query(from)) * TWO.inv();
		ans += s * (mint(i) - anum.query(a[i]));
		const int to = lower_bound(begin(z) + 1, end(z), z[a[i]] + 1) - begin(z) - 1;
		// cerr << from << " " << a[i] << " " << to << endl;
		ans -= s * (dsum.query(to) - dsum.query(a[i])) * d[a[i]].inv() * TWO.inv();
		
		anum.update(a[i], 1);
		dsum.update(a[i], d[a[i]]);
		dinvsum.update(a[i], d[a[i]].inv());
	}

	cout << ans << endl;

	return 0;
}