Problem p02728 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define pb push_back
#define mod int(1e9 + 7)
#define N int(2e5 + 100)
#define ll long long int
#define pp pair<int, int>
#define pl pair<ll, ll>
#define fi first
#define si second
using namespace std;
ll n, u, v, par[N], size[N], ans[N];
ll dp[N], fact[N];
vector<ll> g[N];
ll power(ll x, ll n) {
  if (n == 0) {
    return 1ll;
  }
  ll y = power(x, n / 2);
  y = (y * y) % mod;
  if (n % 2) {
    return (x * y) % mod;
  }
  return y;
}
void pre() {
  fact[0] = 1;
  for (ll i = 1; i < N; i++) {
    fact[i] = (i * fact[i - 1]) % mod;
  }
}
void dfs(ll s, ll p) {
  par[s] = p;
  size[s] = 1;
  for (ll i = 0; i < g[s].size(); i++) {
    if (g[s][i] != p) {
      dfs(g[s][i], s);
      size[s] += size[g[s][i]];
    }
  }
  return;
}
void dfs1(ll s, ll p) {
  ll d = 1ll;
  dp[s] = fact[size[s] - 1];
  for (ll i = 0; i < g[s].size(); i++) {
    if (g[s][i] != p) {
      dfs1(g[s][i], s);
      d = (d * fact[size[g[s][i]]]) % mod;
      dp[s] = (dp[s] * dp[g[s][i]]) % mod;
    }
  }
  dp[s] = (dp[s] * power(d, mod - 2)) % mod;
}
ll reRoot(ll s, ll p) {
  if (p == -1) {
    return dp[s];
  }
  if (ans[s]) {
    return ans[s];
  }
  ll dpp = reRoot(p, par[p]);
  ll dps = dp[s], szp = n - size[s], d;
  d = (fact[n - 1] * dps) % mod;
  dpp = (dpp * power(d, mod - 2)) % mod;
  dpp = (dpp * fact[size[s]]) % mod;
  dpp = (dpp * fact[szp - 1]) % mod;
  d = (fact[size[s] - 1] * fact[szp]) % mod;
  dps = (dps * power(d, mod - 2)) % mod;
  dps = (dps * dpp) % mod;
  dps = (dps * fact[n - 1]) % mod;
  ans[s] = dps;
  return ans[s];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  pre();
  for (ll i = 1; i < n; i++) {
    cin >> u >> v;
    g[v].pb(u);
    g[u].pb(v);
  }
  dfs(1, -1);
  dfs1(1, -1);
  ans[1] = dp[1];
  for (ll k = 1; k <= n; k++) {
    cout << reRoot(k, par[k]) << endl;
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define pb push_back
#define mod int(1e9 + 7)
#define N int(2e5 + 100)
#define ll long long int
#define pp pair<int, int>
#define pl pair<ll, ll>
#define fi first
#define si second
using namespace std;
ll n, u, v, par[N], size[N];
ll dp[N], fact[N];
vector<ll> g[N];
ll power(ll x, ll n) {
  if (n == 0) {
    return 1ll;
  }
  ll y = power(x, n / 2);
  y = (y * y) % mod;
  if (n % 2) {
    return (x * y) % mod;
  }
  return y;
}
void pre() {
  fact[0] = 1;
  for (ll i = 1; i < N; i++) {
    fact[i] = (i * fact[i - 1]) % mod;
  }
}
void dfs(ll s, ll p) {
  par[s] = p;
  size[s] = 1;
  for (ll i = 0; i < g[s].size(); i++) {
    if (g[s][i] != p) {
      dfs(g[s][i], s);
      size[s] += size[g[s][i]];
    }
  }
  return;
}
void dfs1(ll s, ll p) {
  ll d = 1ll;
  dp[s] = fact[size[s] - 1];
  for (ll i = 0; i < g[s].size(); i++) {
    if (g[s][i] != p) {
      dfs1(g[s][i], s);
      d = (d * fact[size[g[s][i]]]) % mod;
      dp[s] = (dp[s] * dp[g[s][i]]) % mod;
    }
  }
  dp[s] = (dp[s] * power(d, mod - 2)) % mod;
}
void reRoot(ll s, ll p) {
  if (p == -1) {
    return;
  }
  reRoot(p, par[p]);
  ll d;
  d = (fact[size[p] - 1] * dp[s]) % mod;
  dp[p] = (dp[p] * power(d, mod - 2)) % mod;
  dp[p] = (dp[p] * fact[size[s]]) % mod;
  size[p] -= size[s];
  par[p] = s;
  dp[p] = (dp[p] * fact[size[p] - 1]) % mod;
  d = (fact[size[s] - 1] * fact[size[p]]) % mod;
  dp[s] = (dp[s] * power(d, mod - 2)) % mod;
  dp[s] = (dp[s] * dp[p]) % mod;
  size[s] = n;
  par[s] = -1;
  dp[s] = (dp[s] * fact[n - 1]) % mod;
  return;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  pre();
  for (ll i = 1; i < n; i++) {
    cin >> u >> v;
    g[v].pb(u);
    g[u].pb(v);
  }
  dfs(1, -1);
  dfs1(1, -1);
  for (ll k = 1; k <= n; k++) {
    reRoot(k, par[k]);
    cout << dp[k] << endl;
  }
  return 0;
}