#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e6 + 10;
const long long mod = 1e9 + 7;
long long n;
long long ans;
long long p[maxn];
long long f[maxn];
long long seg[4 * maxn];
long long fdovvom[maxn];
void in();
void solve();
long long solve(long long);
void add(long long id, long long l, long long r, long long idx, long long val);
long long get(long long id, long long l, long long r, long long L, long long R);
void out();
int main() {
  ios::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  in();
  solve();
  out();
}
void in() {
  cin >> n;
  for (long long i = 0; i < n; i++) {
    cin >> p[i];
    p[i]--;
    add(1, 0, n, i, 1);
  }
}
void solve() {
  f[0] = 1;
  fdovvom[0] = 500000004;
  for (long long i = 1; i < maxn; i++) {
    f[i] = f[i - 1] * i % mod;
    fdovvom[i] = f[i] * 500000004 % mod;
  }
  solve(0);
}
long long solve(long long x) {
  if (x == n) return 1;
  long long t = get(1, 0, n, 0, p[x]);
  add(1, 0, n, p[x], -1);
  ans = (ans + t *
                   ((n - x - 1) * (n - x - 2) % mod * 500000004 % mod *
                    fdovvom[n - x - 1] % mod) %
                   mod) %
        mod;
  ans = (ans + t * (t - 1) % mod * 500000004 % mod * f[n - x - 1] % mod) % mod;
  long long oof = solve(x + 1);
  ans = (ans + t * oof % mod) % mod;
  return (oof + f[n - x - 1] * t % mod) % mod;
}
void add(long long id, long long l, long long r, long long idx, long long val) {
  seg[id] += val;
  if (r - l == 1) return;
  long long mid = (l + r) >> 1;
  if (idx < mid)
    add(id << 1, l, mid, idx, val);
  else
    add(id << 1 | 1, mid, r, idx, val);
}
long long get(long long id, long long l, long long r, long long L,
              long long R) {
  if (r <= L || R <= l) return 0;
  if (L <= l && r <= R) return seg[id];
  long long mid = (l + r) >> 1;
  return get(id << 1, l, mid, L, R) + get(id << 1 | 1, mid, r, L, R);
}
void out() { cout << ans; }
