#include <bits/stdc++.h>
using namespace std;
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;
}
constexpr long long mod = 1e9 + 7;
constexpr long long INF = mod * mod;
constexpr int MAX = 100010;
struct mint {
  using i64 = int_fast64_t;
  i64 a;
  static constexpr i64 mod = 1e9 + 7;
  mint(const i64 a_ = 0) : a(a_) {}
  mint inv() {
    i64 t = 1, n = mod - 2, x = a;
    while (n) {
      if (n & 1) (t *= x) %= mod;
      (x *= x) %= mod;
      n >>= 1;
    }
    mint ret(t);
    return ret;
  }
  bool operator==(const mint &x) { return a == x.a; }
  bool operator!=(const mint &x) { return a != x.a; }
  mint operator+(const mint &x) {
    mint ret;
    ret.a = a + x.a;
    if (ret.a > mod) ret.a -= mod;
    return ret;
  }
  mint operator-(const mint &x) {
    mint ret;
    ret.a = a - x.a;
    if (ret.a < 0) ret.a += mod;
    return ret;
  }
  mint operator*(const mint &x) {
    mint ret;
    ret.a = a * x.a % mod;
    return ret;
  }
  mint operator/(mint &x) {
    mint ret;
    ret.a = a * x.inv().a % mod;
    return ret;
  }
  mint operator^(long long n) {
    mint ret = 1, x = a;
    while (n) {
      if (n & 1) (ret.a *= x.a) %= mod;
      (x.a *= x.a) %= mod;
      n >>= 1;
    }
    return ret;
  }
  mint &operator+=(const mint &x) {
    a += x.a;
    if (a >= mod) a -= mod;
    return *this;
  }
  mint &operator-=(const mint &x) {
    a -= x.a;
    if (a < 0) a += mod;
    return *this;
  }
  mint &operator*=(const mint &x) {
    (a *= x.a) %= mod;
    return *this;
  }
  mint &operator/=(mint &x) {
    (a *= x.inv().a) %= mod;
    return *this;
  }
  mint &operator^=(long long n) {
    long long ret = 1;
    while (n) {
      if (n & 1) (ret *= a) %= mod;
      (a *= a) %= mod;
      n >>= 1;
    }
    a = ret;
    return *this;
  }
};
vector<mint> fact;
vector<mint> revfact;
void setfact(int n) {
  fact.resize(n + 1);
  revfact.resize(n + 1);
  fact[0] = 1;
  for (int((i)) = (0); ((i)) < ((n)); ++((i)))
    fact[i + 1] = fact[i] * mint(i + 1);
  revfact[n] = fact[n].inv();
  for (int i = n - 1; i >= 0; i--) revfact[i] = revfact[i + 1] * mint(i + 1);
}
mint getC(int n, int r) {
  if (n < r) return 0;
  return fact[n] * revfact[r] * revfact[n - r];
}
mint f(int n) {
  if (n < 0) return 1;
  return fact[n];
}
int main() {
  int n;
  scanf("%d", &n);
  assert(n <= 2020);
  setfact(n);
  mint x[n];
  for (int((i)) = (0); ((i)) < ((n)); ++((i))) scanf("%lld", &x[i].a);
  mint ans = 0;
  for (int((i)) = (0); ((i)) < ((n - 1)); ++((i)))
    for (int(k) = (1); (k) < (n - i); ++(k)) {
      if (i + k != n - 1)
        ans += getC(n - 1, k + 1) * f(k - 1) * f(n - 2 - k) * (x[i + k] - x[i]);
      else
        ans += getC(n - 1, i) * f(n - 2 - i) * f(i) * (x[n - 1] - x[i]);
    }
  printf("%lld\n", ans.a);
}
