#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("-ffloat-store")
using namespace std;
clock_t time_p = clock();
void aryanc403() {}
const long long int INF = 0xFFFFFFFFFFFFFFFL;
long long int seed;
mt19937 rng(seed = chrono::steady_clock::now().time_since_epoch().count());
inline long long int rnd(long long int l = 0, long long int r = INF) {
  return uniform_int_distribution<long long int>(l, r)(rng);
}
class CMP {
 public:
  bool operator()(pair<long long int, long long int> a,
                  pair<long long int, long long int> b) {
    return !(a.first < b.first || (a.first == b.first && a.second <= b.second));
  }
};
void add(map<long long int, long long int> &m, long long int x,
         long long int cnt = 1) {
  auto jt = m.find(x);
  if (jt == m.end())
    m.insert({x, cnt});
  else
    jt->second += cnt;
}
void del(map<long long int, long long int> &m, long long int x,
         long long int cnt = 1) {
  auto jt = m.find(x);
  if (jt->second <= cnt)
    m.erase(jt);
  else
    jt->second -= cnt;
}
bool cmp(const pair<long long int, long long int> &a,
         const pair<long long int, long long int> &b) {
  return a.first < b.first || (a.first == b.first && a.second < b.second);
}
const long long int mod = 1000000007L;
const int N = 1e5 + 5;
long long int fac[N + 5], inv[N + 5];
long long int po(long long int a, long long int n) {
  if (n == 0) return 1;
  if (n % 2) return (a * po(a, n - 1)) % mod;
  return po(a * a % mod, n / 2);
}
long long int nCr(long long int n, long long int r) {
  if (n < 0 || r < 0 || r > n) return 0;
  long long int ans = 1;
  ans = (ans * fac[n]) % mod;
  ans = (ans * inv[r]) % mod;
  ans = (ans * inv[n - r]) % mod;
  return ans;
}
void pre(long long int n) {
  long long int i;
  fac[0] = 1;
  for (i = (1); i <= (n); ++i) fac[i] = (i * fac[i - 1]) % mod;
  inv[n] = po(fac[n], mod - 2);
  for (i = (n); i >= (1); --i) inv[i - 1] = (i * inv[i]) % mod;
  assert(inv[0] == 1);
}
long long int T, n, i, j, k, in, cnt, l, r, u, v, x, y;
long long int m;
string s;
vector<long long int> a, d;
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  {
    pre(N);
    cin >> n;
    a.resize(n + 1, 0);
    for (i = 0; i < (n); ++i) cin >> a[i + 1];
    long long int ans = 0;
    d.resize(n + 1, 0);
    for (i = (1); i <= (n); ++i) {
      d[i] = po(i * (i + 1), mod - 2);
      d[i] = d[i - 1] + d[i];
      d[i] %= mod;
    }
    for (i = (1); i <= (n - 1); ++i) {
      ans += a[i] * d[i - 1] % mod;
      ans -= a[i] * d[n - 1 - i] % mod;
      ans %= mod;
    }
    ans %= mod;
    ans *= fac[n - 1];
    ans %= mod;
    for (i = (1); i <= (n - 1); ++i) {
      long long int v;
      j = n;
      v = (nCr(n - 1, j - i) * fac[j - i - 1] % mod) * fac[i - 1] % mod;
      v %= mod;
      ans += v * (a[j] - a[i]) % mod;
    }
    ans %= mod;
    ans += mod;
    ans %= mod;
    cout << ans << "\n";
  }
  aryanc403();
  return 0;
}
