#include <bits/stdc++.h>
using namespace std;
struct seg_tree {
  int l, r;
  long long int val;
} * t;
void build(int pos, int l, int r) {
  t[pos].l = l;
  t[pos].r = r;
  if (l == r) {
    t[pos].val = l;
    return;
  }
  build(2 * pos, l, (l + r) / 2);
  build(2 * pos + 1, (l + r) / 2 + 1, r);
  t[pos].val = t[2 * pos].val * t[2 * pos + 1].val;
  t[pos].val %= 1000000007;
  return;
}
long long int query(int pos, int l, int r) {
  l = max(l, t[pos].l);
  r = min(r, t[pos].r);
  if (l > t[pos].r || r < t[pos].l) return 1;
  if (l == r) return l;
  if (t[pos].l == l && t[pos].r == r) return t[pos].val;
  return (query(2 * pos, l, r) * query(2 * pos + 1, l, r)) % 1000000007;
}
int main() {
  t = new seg_tree[5000000];
  build(1, 1, 1000000);
  int n;
  scanf("%d", &n);
  int a[n + 1], i, j;
  for (i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  sort(a + 1, a + n + 1);
  long long int temp[n + 1], ans = 0;
  for (i = 1; i <= n; i++) {
    if (i > 1 && a[i] == a[i - 1])
      temp[i] = temp[i - 1];
    else {
      temp[i] = query(1, 1, n - i) * query(1, n - i + 2, n);
      temp[i] %= 1000000007;
      temp[i] *= a[i];
      temp[i] %= 1000000007;
    }
    if (a[i] != a[n]) {
      ans += temp[i];
      ans %= 1000000007;
    } else
      break;
  }
  printf("%lld\n", ans);
  return 0;
}
