Problem p02807 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <vector>
using namespace std;
typedef long long int ll;
typedef uint_fast64_t u64;
#define bit(n, k) ((n >> k) & 1) /*nのk bit目*/

const int MOD = 1000000007;

struct ModInt {
  u64 a;
  ModInt() : a(0) {}
  ModInt(u64 x) : a(x % MOD) {}

  ModInt operator+=(const ModInt p) {
    a += p.a;
    if (a >= MOD)
      a -= MOD;
    return *this;
  }
  ModInt operator-=(const ModInt p) {
    a -= p.a;
    if (a < 0)
      a += MOD;
    return *this;
  }
  ModInt operator*=(const ModInt p) {
    a = (a * p.a) % MOD;
    return *this;
  }

  ModInt operator+(const ModInt p) {
    ModInt x(a);
    return x += p;
  }
  ModInt operator-(const ModInt p) {
    ModInt x(a);
    return x -= p;
  }
  ModInt operator*(const ModInt p) {
    ModInt x(a);
    return x *= p;
  }
  ModInt operator=(ll p) {
    a = p;
    return *this;
  }

  bool operator==(const ModInt p) { return a == p.a; }

  bool operator!=(const ModInt p) { return a != p.a; }

  ModInt pow(u64 N) {
    ModInt ans(1), p(a);
    while (N > 0) {
      if (bit(N, 0)) {
        ans *= p;
      }
      p *= p;
      N >>= 1;
    }
    return ans;
  }
  ModInt inverse() { return pow(MOD - 2); }
};

signed main(void) {
  int N;
  cin >> N;
  ModInt t(1);
  ModInt i(1);
  for (; i.a <= N - 1; i.a++) {
    t *= i;
  }
  ModInt S[11000], x[11000];
  for (i.a = 1; i.a <= N - 1; i.a++) {
    S[i.a] += S[i.a - 1] + t * i.inverse();
  }
  for (int a = 1; a <= N; a++)
    cin >> x[a].a;
  ModInt ans(0);
  for (int a = 1; a <= N - 1; a++) {
    ans += S[a] * (x[a + 1] - x[a]);
  }
  cout << ans.a << endl;
}

Fixed submission:
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <vector>
using namespace std;
typedef long long int ll;
typedef uint_fast64_t u64;
#define bit(n, k) ((n >> k) & 1) /*nのk bit目*/

const int MOD = 1000000007;

struct ModInt {
  u64 a;
  ModInt() : a(0) {}
  ModInt(u64 x) : a(x % MOD) {}

  ModInt operator+=(const ModInt p) {
    a += p.a;
    if (a >= MOD)
      a -= MOD;
    return *this;
  }
  ModInt operator-=(const ModInt p) {
    a -= p.a;
    if (a < 0)
      a += MOD;
    return *this;
  }
  ModInt operator*=(const ModInt p) {
    a = (a * p.a) % MOD;
    return *this;
  }

  ModInt operator+(const ModInt p) {
    ModInt x(a);
    return x += p;
  }
  ModInt operator-(const ModInt p) {
    ModInt x(a);
    return x -= p;
  }
  ModInt operator*(const ModInt p) {
    ModInt x(a);
    return x *= p;
  }
  ModInt operator=(ll p) {
    a = p;
    return *this;
  }

  bool operator==(const ModInt p) { return a == p.a; }

  bool operator!=(const ModInt p) { return a != p.a; }

  ModInt pow(u64 N) {
    ModInt ans(1), p(a);
    while (N > 0) {
      if (bit(N, 0)) {
        ans *= p;
      }
      p *= p;
      N >>= 1;
    }
    return ans;
  }
  ModInt inverse() { return pow(MOD - 2); }
};

signed main(void) {
  int N;
  cin >> N;
  ModInt t(1);
  ModInt i(1);
  for (; i.a <= N - 1; i.a++) {
    t *= i;
  }
  ModInt S[110000], x[110000];
  for (i.a = 1; i.a <= N - 1; i.a++) {
    S[i.a] += S[i.a - 1] + t * i.inverse();
  }
  for (int a = 1; a <= N; a++)
    cin >> x[a].a;
  ModInt ans(0);
  for (int a = 1; a <= N - 1; a++) {
    ans += S[a] * (x[a + 1] - x[a]);
  }
  cout << ans.a << endl;
}