Problem p02625 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef signed long long ll;

#undef _P
#define _P(...) (void)printf(__VA_ARGS__)
#define FOR(x, to) for (x = 0; x < (to); x++)
#define FORR(x, arr) for (auto &x : arr)
#define ITR(x, c) for (__typeof(c.begin()) x = c.begin(); x != c.end(); x++)
#define ALL(a) (a.begin()), (a.end())
#define ZERO(a) memset(a, 0, sizeof(a))
#define MINUS(a) memset(a, 0xff, sizeof(a))
//-------------------------------------------------------

ll dp[505050];
int N, M;
const ll mo = 1000000007;
const int NUM_ = 400001;
static ll fact[NUM_ + 1], factr[NUM_ + 1], inv[NUM_ + 1];

ll comb(ll N_, ll C_) {
  if (C_ < 0 || C_ > N_)
    return 0;
  return factr[C_] * fact[N_] % mo * factr[N_ - C_] % mo;
}

void solve() {
  int i, j, k, l, r, x, y;
  string s;

  inv[1] = fact[0] = factr[0] = 1;
  for (int i = 2; i <= NUM_; ++i)
    inv[i] = inv[mo % i] * (mo - mo / i) % mo;
  for (int i = 1; i <= NUM_; ++i)
    fact[i] = fact[i - 1] * i % mo, factr[i] = factr[i - 1] * inv[i] % mo;

  cin >> N >> M;
  ll ret = 0;
  FOR(i, N + 1) {
    dp[i] = comb(M, i) * comb(N, i) % mo * fact[i] % mo * fact[M - i] % mo *
            fact[M - i] % mo * factr[M - N] % mo * factr[M - N] % mo;
    if (i % 2) {
      ret -= dp[i];
    } else {
      ret += dp[i];
    }
  }

  cout << (ret % mo + mo) % mo << endl;
}

int main(int argc, char **argv) {
  string s;
  int i;
  if (argc == 1)
    ios::sync_with_stdio(false), cin.tie(0);
  FOR(i, argc - 1) s += argv[i + 1], s += '\n';
  FOR(i, s.size()) ungetc(s[s.size() - 1 - i], stdin);
  cout.tie(0);
  solve();
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef signed long long ll;

#undef _P
#define _P(...) (void)printf(__VA_ARGS__)
#define FOR(x, to) for (x = 0; x < (to); x++)
#define FORR(x, arr) for (auto &x : arr)
#define ITR(x, c) for (__typeof(c.begin()) x = c.begin(); x != c.end(); x++)
#define ALL(a) (a.begin()), (a.end())
#define ZERO(a) memset(a, 0, sizeof(a))
#define MINUS(a) memset(a, 0xff, sizeof(a))
//-------------------------------------------------------

ll dp[505050];
int N, M;
const ll mo = 1000000007;
const int NUM_ = 600001;
static ll fact[NUM_ + 1], factr[NUM_ + 1], inv[NUM_ + 1];

ll comb(ll N_, ll C_) {
  if (C_ < 0 || C_ > N_)
    return 0;
  return factr[C_] * fact[N_] % mo * factr[N_ - C_] % mo;
}

void solve() {
  int i, j, k, l, r, x, y;
  string s;

  inv[1] = fact[0] = factr[0] = 1;
  for (int i = 2; i <= NUM_; ++i)
    inv[i] = inv[mo % i] * (mo - mo / i) % mo;
  for (int i = 1; i <= NUM_; ++i)
    fact[i] = fact[i - 1] * i % mo, factr[i] = factr[i - 1] * inv[i] % mo;

  cin >> N >> M;
  ll ret = 0;
  FOR(i, N + 1) {
    dp[i] = comb(M, i) * comb(N, i) % mo * fact[i] % mo * fact[M - i] % mo *
            fact[M - i] % mo * factr[M - N] % mo * factr[M - N] % mo;
    if (i % 2) {
      ret -= dp[i];
    } else {
      ret += dp[i];
    }
  }

  cout << (ret % mo + mo) % mo << endl;
}

int main(int argc, char **argv) {
  string s;
  int i;
  if (argc == 1)
    ios::sync_with_stdio(false), cin.tie(0);
  FOR(i, argc - 1) s += argv[i + 1], s += '\n';
  FOR(i, s.size()) ungetc(s[s.size() - 1 - i], stdin);
  cout.tie(0);
  solve();
  return 0;
}