#include <bits/stdc++.h>
#pragma GCC optimize("O3")
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
T gcd(T a, T b) {
  if (a < b) std::swap(a, b);
  while (b) std::swap(a %= b, b);
  return a;
}
template <class T>
T lcm(const T a, const T b) {
  return a / gcd(a, b) * b;
}
using ll = long signed long;
using ull = long unsigned long;
using ld = long double;
using namespace std;
struct inp {
  size_t sz;
  inp(size_t _sz = 1) : sz(_sz) {}
  template <typename T>
  operator T() const {
    T a;
    cin >> a;
    return a;
  }
  template <typename T>
  operator vector<T>() const {
    vector<T> a(sz);
    for (size_t i = 0; i < sz; i++) cin >> a[i];
    return a;
  }
  template <typename T, typename U>
  operator pair<T, U>() const {
    T f;
    U s;
    cin >> f >> s;
    return pair<T, U>(f, s);
  }
};
inp inp1;
template <typename T>
void say(T &x, char end = '\n') {
  cout << x << end;
}
template <typename T>
void say(vector<T> &x, char sep = ' ', char end = '\n') {
  for (size_t i = 0, sz = x.size(); i < sz; i++) {
    cout << x[i] << (i == sz - 1 ? end : sep);
  }
}
constexpr ll pdiv = 1000000007LL;
ll powll(ll a, ll n) {
  ll result = 1;
  ll base = a;
  ll mask = 1;
  while (mask <= n) {
    if (n & mask) (result *= base) %= pdiv;
    mask <<= 1;
    (base *= base) %= pdiv;
  }
  return result;
}
inline ll invll(ll a) { return powll(a, pdiv - 2); }
vector<ll> fac_cache = {1}, invfac_cache = {1};
void make_fac_cache(ll a) {
  ll old_max = fac_cache.size() - 1;
  if (a > old_max) {
    fac_cache.resize(a + 1);
    invfac_cache.resize(a + 1);
    for (ll i = old_max + 1; i <= a; i++) {
      fac_cache[i] = fac_cache[i - 1] * i % pdiv;
    }
    invfac_cache[a] = invll(fac_cache[a]);
    for (ll i = a - 1; i > old_max; i--) {
      invfac_cache[i] = invfac_cache[i + 1] * (i + 1) % pdiv;
    }
  }
}
inline ll facll(ll a) {
  make_fac_cache(a);
  return fac_cache[a];
}
inline ll invfacll(ll a) {
  make_fac_cache(a);
  return invfac_cache[a];
}
inline bool isoutll(ll n, ll r) { return n < 0 || r < 0 || n < r; }
inline ll nPr(ll n, ll r) {
  return isoutll(n, r) ? 0 : facll(n) * invfacll(n - r) % pdiv;
}
inline ll nCr(ll n, ll r) {
  return isoutll(n, r) ? 0
                       : facll(n) * invfacll(n - r) % pdiv * invfacll(r) % pdiv;
}
inline ll nHr(ll n, ll r) { return nCr(n + r - 1, r); }
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll n = inp1;
  vector<ll> x = inp(n);
  vector<ll> d(n - 1);
  for (long long i = 0, i_len = (n - 1); i < i_len; i++) d[i] = x[i + 1] - x[i];
  if (n > 2000) return 1;
  ll ans = 0;
  for (long long j = 0, j_len = (n - 1); j < j_len; j++) {
    ll m = j + 1;
    vector<ll> dp(m, 0);
    make_fac_cache(m);
    for (long long i = 0, i_len = (m); i < i_len; i++) {
      dp[i] = facll(m) * invll(m - i) % pdiv;
    }
    for (long long i = 0, i_len = (m - 1); i < i_len; i++) {
      (dp[i + 1] += dp[i]) %= pdiv;
    }
    ll term = dp.back() % pdiv;
    (term *= nPr(n - 1, n - 1 - m)) %= pdiv;
    (term *= d[j]) %= pdiv;
    (ans += term) %= pdiv;
  }
  say(ans);
}
