Problem p02822 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
vector<int> Childnum(100000, -1);
vector<vector<int>> Child(100000, vector<int>(0));
// https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a
//  a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}

// a^{-1} mod を計算する
long long modinv(long long a, long long mod) { return modpow(a, mod - 2, mod); }
int dp(int i) {
  if (Childnum[i] != -1) {
    return Childnum[i];
  }
  if (Child[i].size() == 0) {
    Childnum[i] = 0;
    return 0;
  }
  int res = 0;
  for (auto &&j : Child[i]) {
    res += dp(j) + 1;
  }
  Childnum[i] = res;
  return res;
}
int main(void) {
  long long int mod = 1000000007;
  int N;
  cin >> N;
  vector<vector<int>> G(N, vector<int>(0));
  for (int i = 0; i < N - 1; i++) {
    int a, b;
    cin >> a >> b;
    G[a - 1].push_back(b - 1);
    G[b - 1].push_back(a - 1);
  }
  queue<int> q;
  q.push(0);
  vector<int> reached(N, 0);
  while (!q.empty()) {
    int r = q.front();
    q.pop();
    reached[r] = 1;
    for (auto &&p : G[r]) {
      if (reached[p] == 1) {
        continue;
      }
      Child[r].push_back(p);
      q.push(p);
    }
  }
  dp(0);
  long long int ans = (N * (1 - modinv(modpow(2, N - 1, mod), mod))) % mod;
  for (int r = 0; r < N; r++) {
    long long int tmp = 0;
    for (auto &&p : Child[r]) {
      long long int ai = Childnum[p] + 1;
      tmp += ai;
      long long int k1 = (1 - modinv(modpow(2, ai, mod), mod)) % mod;
      long long int k2 = modinv(modpow(2, N - 1 - ai, mod), mod);
      ans -= (k1 * k2) % mod;
      ans %= mod;
    }
    long long int ai = N - 1 - tmp;
    long long int k1 = (1 - modinv(modpow(2, ai, mod), mod)) % mod;
    long long int k2 = modinv(modpow(2, N - 1 - ai, mod), mod);
    ans -= (k1 * k2) % mod;
    ans %= mod;
  }
  cout << ((ans * modinv(2, mod)) % mod) << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
vector<int> Childnum(200005, -1);
vector<vector<int>> Child(200005, vector<int>(0));
// https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a
//  a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}

// a^{-1} mod を計算する
long long modinv(long long a, long long mod) { return modpow(a, mod - 2, mod); }
int dp(int i) {
  if (Childnum[i] != -1) {
    return Childnum[i];
  }
  if (Child[i].size() == 0) {
    Childnum[i] = 0;
    return 0;
  }
  int res = 0;
  for (auto &&j : Child[i]) {
    res += dp(j) + 1;
  }
  Childnum[i] = res;
  return res;
}
int main(void) {
  long long int mod = 1000000007;
  int N;
  cin >> N;
  vector<vector<int>> G(N, vector<int>(0));
  for (int i = 0; i < N - 1; i++) {
    int a, b;
    cin >> a >> b;
    G[a - 1].push_back(b - 1);
    G[b - 1].push_back(a - 1);
  }
  queue<int> q;
  q.push(0);
  vector<int> reached(N, 0);
  while (!q.empty()) {
    int r = q.front();
    q.pop();
    reached[r] = 1;
    for (auto &&p : G[r]) {
      if (reached[p] == 1) {
        continue;
      }
      Child[r].push_back(p);
      q.push(p);
    }
  }
  dp(0);
  long long int ans = (N * (1 - modinv(modpow(2, N - 1, mod), mod))) % mod;
  for (int r = 0; r < N; r++) {
    long long int tmp = 0;
    for (auto &&p : Child[r]) {
      long long int ai = Childnum[p] + 1;
      tmp += ai;
      long long int k1 = (1 - modinv(modpow(2, ai, mod), mod)) % mod;
      long long int k2 = modinv(modpow(2, N - 1 - ai, mod), mod);
      ans -= (k1 * k2) % mod;
      ans %= mod;
    }
    long long int ai = N - 1 - tmp;
    long long int k1 = (1 - modinv(modpow(2, ai, mod), mod)) % mod;
    long long int k2 = modinv(modpow(2, N - 1 - ai, mod), mod);
    ans -= (k1 * k2) % mod;
    ans %= mod;
  }
  cout << ((ans * modinv(2, mod)) % mod) << endl;
}