Problem p03492 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <stdio.h>
const int mod = 1e9 + 7;
int ad(int x, int y) {
  x += y;
  return x >= mod ? x - mod : x;
}
int sb(int x, int y) {
  x -= y;
  return x < 0 ? x + mod : x;
}
int mu(int x, int y) { return 1ll * x * y % mod; }
void up(int &x, int y) {
  x += y;
  if (x >= mod)
    x -= mod;
}
using namespace std;
vector<int> ve[5005];
int f[5005][5005];
int RT;
int n;
int V[5005], TT, sz[5005];
void dfs(int x, int ba) {
  sz[x] = 1;
  int sso = 0;
  for (auto y : ve[x]) {
    if (y == ba)
      continue;
    dfs(y, x);
    sso = max(sso, sz[y]);
    sz[x] += sz[y];
  }
  sso = max(sso, n - sz[x]);
  if (sso <= n / 2)
    RT = (RT ? -1 : x);
}
int fac[5005], inv[5005];
int A(int x, int y) { return mu(fac[x], inv[x - y]); }
int C(int x, int y) { return mu(fac[x], mu(inv[x - y], inv[y])); }

int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    ve[x].push_back(y);
    ve[y].push_back(x);
  }
  fac[0] = 1;
  for (int i = 1; i <= n; i++)
    fac[i] = mu(fac[i - 1], i);
  inv[0] = inv[1] = 1;
  for (int i = 2; i <= n; i++)
    inv[i] = mu(inv[mod % i], mod - mod / i);
  for (int i = 2; i <= n; i++)
    inv[i] = mu(inv[i - 1], inv[i]);
  dfs(1, 0);
  if (RT == -1) {
    printf("%d", mu(fac[n / 2], fac[n / 2]));
    return 0;
  }
  if (RT != 1)
    V[++TT] = n - sz[RT];
  for (auto y : ve[RT]) {
    if (sz[y] < sz[RT])
      V[++TT] = sz[y];
  }
  f[0][0] = 1;
  int tot = 0;
  for (int i = 1; i <= TT; i++) {
    tot += V[i];
    for (int j = 0; j <= tot; j++) {
      for (int k = 0; k <= min(sz[i], j); k++) {
        up(f[i][j], mu(f[i - 1][j - k], mu(C(V[i], k), A(V[i], k))));
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < n; i++) {
    if (i & 1)
      ans = sb(ans, mu(f[TT][i], fac[n - i]));
    else
      ans = ad(ans, mu(f[TT][i], fac[n - i]));
  }
  printf("%d", ans);
}

Fixed submission:
#include <bits/stdc++.h>
#include <stdio.h>
const int mod = 1e9 + 7;
int ad(int x, int y) {
  x += y;
  return x >= mod ? x - mod : x;
}
int sb(int x, int y) {
  x -= y;
  return x < 0 ? x + mod : x;
}
int mu(int x, int y) { return 1ll * x * y % mod; }
void up(int &x, int y) {
  x += y;
  if (x >= mod)
    x -= mod;
}
using namespace std;
vector<int> ve[5005];
int f[5005][5005];
int RT;
int n;
int V[5005], TT, sz[5005];
void dfs(int x, int ba) {
  sz[x] = 1;
  int sso = 0;
  for (auto y : ve[x]) {
    if (y == ba)
      continue;
    dfs(y, x);
    sso = max(sso, sz[y]);
    sz[x] += sz[y];
  }
  sso = max(sso, n - sz[x]);
  if (sso <= n / 2)
    RT = (RT ? -1 : x);
}
int fac[5005], inv[5005];
int A(int x, int y) { return mu(fac[x], inv[x - y]); }
int C(int x, int y) { return mu(fac[x], mu(inv[x - y], inv[y])); }

int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    ve[x].push_back(y);
    ve[y].push_back(x);
  }
  fac[0] = 1;
  for (int i = 1; i <= n; i++)
    fac[i] = mu(fac[i - 1], i);
  inv[0] = inv[1] = 1;
  for (int i = 2; i <= n; i++)
    inv[i] = mu(inv[mod % i], mod - mod / i);
  for (int i = 2; i <= n; i++)
    inv[i] = mu(inv[i - 1], inv[i]);
  dfs(1, 0);
  if (RT == -1) {
    printf("%d", mu(fac[n / 2], fac[n / 2]));
    return 0;
  }
  if (RT != 1)
    V[++TT] = n - sz[RT];
  for (auto y : ve[RT]) {
    if (sz[y] < sz[RT])
      V[++TT] = sz[y];
  }
  f[0][0] = 1;
  int tot = 0;
  for (int i = 1; i <= TT; i++) {
    tot += V[i];
    for (int j = 0; j <= tot; j++) {
      for (int k = 0; k <= min(V[i], j); k++) {
        up(f[i][j], mu(f[i - 1][j - k], mu(C(V[i], k), A(V[i], k))));
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < n; i++) {
    if (i & 1)
      ans = sb(ans, mu(f[TT][i], fac[n - i]));
    else
      ans = ad(ans, mu(f[TT][i], fac[n - i]));
  }
  printf("%d", ans);
}