#include <bits/stdc++.h>
using namespace std;
class BigNum {
 private:
  int a[100];
  int len;

 public:
  BigNum() {
    len = 1;
    memset(a, 0, sizeof(a));
  }
  BigNum(const int);
  BigNum(const char *);
  BigNum(const BigNum &);
  BigNum &operator=(const BigNum &);
  friend istream &operator>>(istream &, BigNum &);
  friend ostream &operator<<(ostream &, BigNum &);
  BigNum operator+(const BigNum &) const;
  BigNum operator-(const BigNum &) const;
  BigNum operator*(const BigNum &) const;
  BigNum operator/(const int &) const;
  BigNum operator^(const int &) const;
  int operator%(const int &) const;
  bool operator>(const BigNum &T) const;
  bool operator>(const int &t) const;
  void print();
};
BigNum::BigNum(const int b) {
  int c, d = b;
  len = 0;
  memset(a, 0, sizeof(a));
  while (d > 9999) {
    c = d - (d / (9999 + 1)) * (9999 + 1);
    d = d / (9999 + 1);
    a[len++] = c;
  }
  a[len++] = d;
}
BigNum::BigNum(const char *s) {
  int t, k, index, l, i;
  memset(a, 0, sizeof(a));
  l = strlen(s);
  len = l / 4;
  if (l % 4) len++;
  index = 0;
  for (i = l - 1; i >= 0; i -= 4) {
    t = 0;
    k = i - 4 + 1;
    if (k < 0) k = 0;
    for (int j = k; j <= i; j++) t = t * 10 + s[j] - '0';
    a[index++] = t;
  }
}
BigNum::BigNum(const BigNum &T) : len(T.len) {
  int i;
  memset(a, 0, sizeof(a));
  for (i = 0; i < len; i++) a[i] = T.a[i];
}
BigNum &BigNum::operator=(const BigNum &n) {
  int i;
  len = n.len;
  memset(a, 0, sizeof(a));
  for (i = 0; i < len; i++) a[i] = n.a[i];
  return *this;
}
istream &operator>>(istream &in, BigNum &b) {
  char ch[10 * 4];
  int i = -1;
  in >> ch;
  int l = strlen(ch);
  int count = 0, sum = 0;
  for (i = l - 1; i >= 0;) {
    sum = 0;
    int t = 1;
    for (int j = 0; j < 4 && i >= 0; j++, i--, t *= 10) {
      sum += (ch[i] - '0') * t;
    }
    b.a[count] = sum;
    count++;
  }
  b.len = count++;
  return in;
}
ostream &operator<<(ostream &out, BigNum &b) {
  int i;
  cout << b.a[b.len - 1];
  for (i = b.len - 2; i >= 0; i--) {
    cout.width(4);
    cout.fill('0');
    cout << b.a[i];
  }
  return out;
}
BigNum BigNum::operator+(const BigNum &T) const {
  BigNum t(*this);
  int i, big;
  big = T.len > len ? T.len : len;
  for (i = 0; i < big; i++) {
    t.a[i] += T.a[i];
    if (t.a[i] > 9999) {
      t.a[i + 1]++;
      t.a[i] -= 9999 + 1;
    }
  }
  if (t.a[big] != 0)
    t.len = big + 1;
  else
    t.len = big;
  return t;
}
BigNum BigNum::operator-(const BigNum &T) const {
  int i, j, big;
  bool flag;
  BigNum t1, t2;
  if (*this > T) {
    t1 = *this;
    t2 = T;
    flag = 0;
  } else {
    t1 = T;
    t2 = *this;
    flag = 1;
  }
  big = t1.len;
  for (i = 0; i < big; i++) {
    if (t1.a[i] < t2.a[i]) {
      j = i + 1;
      while (t1.a[j] == 0) j++;
      t1.a[j--]--;
      while (j > i) t1.a[j--] += 9999;
      t1.a[i] += 9999 + 1 - t2.a[i];
    } else
      t1.a[i] -= t2.a[i];
  }
  t1.len = big;
  while (t1.a[len - 1] == 0 && t1.len > 1) {
    t1.len--;
    big--;
  }
  if (flag) t1.a[big - 1] = 0 - t1.a[big - 1];
  return t1;
}
BigNum BigNum::operator*(const BigNum &T) const {
  BigNum ret;
  int i, j, up;
  int temp, temp1;
  for (i = 0; i < len; i++) {
    up = 0;
    for (j = 0; j < T.len; j++) {
      temp = a[i] * T.a[j] + ret.a[i + j] + up;
      if (temp > 9999) {
        temp1 = temp - temp / (9999 + 1) * (9999 + 1);
        up = temp / (9999 + 1);
        ret.a[i + j] = temp1;
      } else {
        up = 0;
        ret.a[i + j] = temp;
      }
    }
    if (up != 0) ret.a[i + j] = up;
  }
  ret.len = i + j;
  while (ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
  return ret;
}
BigNum BigNum::operator/(const int &b) const {
  BigNum ret;
  int i, down = 0;
  for (i = len - 1; i >= 0; i--) {
    ret.a[i] = (a[i] + down * (9999 + 1)) / b;
    down = a[i] + down * (9999 + 1) - ret.a[i] * b;
  }
  ret.len = len;
  while (ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
  return ret;
}
int BigNum::operator%(const int &b) const {
  int i, d = 0;
  for (i = len - 1; i >= 0; i--) {
    d = ((d * (9999 + 1)) % b + a[i]) % b;
  }
  return d;
}
BigNum BigNum::operator^(const int &n) const {
  BigNum t, ret(1);
  int i;
  if (n < 0) exit(-1);
  if (n == 0) return 1;
  if (n == 1) return *this;
  int m = n;
  while (m > 1) {
    t = *this;
    for (i = 1; i << 1 <= m; i <<= 1) {
      t = t * t;
    }
    m -= i;
    ret = ret * t;
    if (m == 1) ret = ret * (*this);
  }
  return ret;
}
bool BigNum::operator>(const BigNum &T) const {
  int ln;
  if (len > T.len)
    return true;
  else if (len == T.len) {
    ln = len - 1;
    while (a[ln] == T.a[ln] && ln >= 0) ln--;
    if (ln >= 0 && a[ln] > T.a[ln])
      return true;
    else
      return false;
  } else
    return false;
}
bool BigNum::operator>(const int &t) const {
  BigNum b(t);
  return *this > b;
}
void BigNum::print() {
  int i;
  cout << a[len - 1];
  for (i = len - 2; i >= 0; i--) {
    cout.width(4);
    cout.fill('0');
    cout << a[i];
  }
  cout << endl;
}
const int maxn = 705;
struct graph_node {
  int next, to;
} graph[maxn * 2];
int head[maxn], tot_len = 0, n;
BigNum f[maxn][maxn];
int tot[maxn];
void addedge(int p1, int p2) {
  graph[tot_len].next = head[p1];
  graph[tot_len].to = p2;
  head[p1] = tot_len++;
}
void DFS(int p, int fa) {
  f[p][1] = 1;
  tot[p] = 1;
  for (int i = head[p]; i != -1; i = graph[i].next) {
    int v = graph[i].to;
    if (v == fa) continue;
    DFS(v, p);
    for (int i = tot[p]; i >= 1; i--) {
      for (int j = tot[v]; j >= 0; j--) {
        if (f[p][i] * f[v][j] > f[p][i + j]) f[p][i + j] = f[p][i] * f[v][j];
      }
    }
    tot[p] += tot[v];
  }
  for (int i = 1; i <= tot[p]; i++)
    if (f[p][i] * i > f[p][0]) f[p][0] = f[p][i] * i;
}
int main() {
  cin >> n;
  memset(head, -1, sizeof(head));
  for (int i = 0; i < n - 1; i++) {
    int p1, p2;
    cin >> p1 >> p2;
    p1--, p2--;
    addedge(p1, p2);
    addedge(p2, p1);
  }
  DFS(0, -1);
  cout << f[0][0] << endl;
  return 0;
}

### Prompt

Create a solution in cpp for the following problem:

Recently Bob invented a new game with a tree (we should remind you, that a tree is a connected graph without cycles): he deletes any (possibly, zero) amount of edges of the tree, and counts the product of sizes of the connected components left after the deletion. Your task is to find out the maximum number that Bob can get in his new game for a given tree.

Input

The first input line contains integer number n (1 ≤ n ≤ 700) — amount of vertices in the tree. The following n - 1 lines contain the description of the edges. Each line contains the pair of vertices' indexes, joined by an edge, ai, bi (1 ≤ ai, bi ≤ n). It's guaranteed that the graph described in the input is a tree.

Output

Output the only number — the maximum product of sizes of the connected components, that Bob can get after deleting some of the tree's edges.

Examples

Input

5
1 2
2 3
3 4
4 5


Output

6

Input

8
1 2
1 3
2 4
2 5
3 6
3 7
6 8


Output

18

Input

3
1 2
1 3


Output

3

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
class BigNum {
 private:
  int a[100];
  int len;

 public:
  BigNum() {
    len = 1;
    memset(a, 0, sizeof(a));
  }
  BigNum(const int);
  BigNum(const char *);
  BigNum(const BigNum &);
  BigNum &operator=(const BigNum &);
  friend istream &operator>>(istream &, BigNum &);
  friend ostream &operator<<(ostream &, BigNum &);
  BigNum operator+(const BigNum &) const;
  BigNum operator-(const BigNum &) const;
  BigNum operator*(const BigNum &) const;
  BigNum operator/(const int &) const;
  BigNum operator^(const int &) const;
  int operator%(const int &) const;
  bool operator>(const BigNum &T) const;
  bool operator>(const int &t) const;
  void print();
};
BigNum::BigNum(const int b) {
  int c, d = b;
  len = 0;
  memset(a, 0, sizeof(a));
  while (d > 9999) {
    c = d - (d / (9999 + 1)) * (9999 + 1);
    d = d / (9999 + 1);
    a[len++] = c;
  }
  a[len++] = d;
}
BigNum::BigNum(const char *s) {
  int t, k, index, l, i;
  memset(a, 0, sizeof(a));
  l = strlen(s);
  len = l / 4;
  if (l % 4) len++;
  index = 0;
  for (i = l - 1; i >= 0; i -= 4) {
    t = 0;
    k = i - 4 + 1;
    if (k < 0) k = 0;
    for (int j = k; j <= i; j++) t = t * 10 + s[j] - '0';
    a[index++] = t;
  }
}
BigNum::BigNum(const BigNum &T) : len(T.len) {
  int i;
  memset(a, 0, sizeof(a));
  for (i = 0; i < len; i++) a[i] = T.a[i];
}
BigNum &BigNum::operator=(const BigNum &n) {
  int i;
  len = n.len;
  memset(a, 0, sizeof(a));
  for (i = 0; i < len; i++) a[i] = n.a[i];
  return *this;
}
istream &operator>>(istream &in, BigNum &b) {
  char ch[10 * 4];
  int i = -1;
  in >> ch;
  int l = strlen(ch);
  int count = 0, sum = 0;
  for (i = l - 1; i >= 0;) {
    sum = 0;
    int t = 1;
    for (int j = 0; j < 4 && i >= 0; j++, i--, t *= 10) {
      sum += (ch[i] - '0') * t;
    }
    b.a[count] = sum;
    count++;
  }
  b.len = count++;
  return in;
}
ostream &operator<<(ostream &out, BigNum &b) {
  int i;
  cout << b.a[b.len - 1];
  for (i = b.len - 2; i >= 0; i--) {
    cout.width(4);
    cout.fill('0');
    cout << b.a[i];
  }
  return out;
}
BigNum BigNum::operator+(const BigNum &T) const {
  BigNum t(*this);
  int i, big;
  big = T.len > len ? T.len : len;
  for (i = 0; i < big; i++) {
    t.a[i] += T.a[i];
    if (t.a[i] > 9999) {
      t.a[i + 1]++;
      t.a[i] -= 9999 + 1;
    }
  }
  if (t.a[big] != 0)
    t.len = big + 1;
  else
    t.len = big;
  return t;
}
BigNum BigNum::operator-(const BigNum &T) const {
  int i, j, big;
  bool flag;
  BigNum t1, t2;
  if (*this > T) {
    t1 = *this;
    t2 = T;
    flag = 0;
  } else {
    t1 = T;
    t2 = *this;
    flag = 1;
  }
  big = t1.len;
  for (i = 0; i < big; i++) {
    if (t1.a[i] < t2.a[i]) {
      j = i + 1;
      while (t1.a[j] == 0) j++;
      t1.a[j--]--;
      while (j > i) t1.a[j--] += 9999;
      t1.a[i] += 9999 + 1 - t2.a[i];
    } else
      t1.a[i] -= t2.a[i];
  }
  t1.len = big;
  while (t1.a[len - 1] == 0 && t1.len > 1) {
    t1.len--;
    big--;
  }
  if (flag) t1.a[big - 1] = 0 - t1.a[big - 1];
  return t1;
}
BigNum BigNum::operator*(const BigNum &T) const {
  BigNum ret;
  int i, j, up;
  int temp, temp1;
  for (i = 0; i < len; i++) {
    up = 0;
    for (j = 0; j < T.len; j++) {
      temp = a[i] * T.a[j] + ret.a[i + j] + up;
      if (temp > 9999) {
        temp1 = temp - temp / (9999 + 1) * (9999 + 1);
        up = temp / (9999 + 1);
        ret.a[i + j] = temp1;
      } else {
        up = 0;
        ret.a[i + j] = temp;
      }
    }
    if (up != 0) ret.a[i + j] = up;
  }
  ret.len = i + j;
  while (ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
  return ret;
}
BigNum BigNum::operator/(const int &b) const {
  BigNum ret;
  int i, down = 0;
  for (i = len - 1; i >= 0; i--) {
    ret.a[i] = (a[i] + down * (9999 + 1)) / b;
    down = a[i] + down * (9999 + 1) - ret.a[i] * b;
  }
  ret.len = len;
  while (ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
  return ret;
}
int BigNum::operator%(const int &b) const {
  int i, d = 0;
  for (i = len - 1; i >= 0; i--) {
    d = ((d * (9999 + 1)) % b + a[i]) % b;
  }
  return d;
}
BigNum BigNum::operator^(const int &n) const {
  BigNum t, ret(1);
  int i;
  if (n < 0) exit(-1);
  if (n == 0) return 1;
  if (n == 1) return *this;
  int m = n;
  while (m > 1) {
    t = *this;
    for (i = 1; i << 1 <= m; i <<= 1) {
      t = t * t;
    }
    m -= i;
    ret = ret * t;
    if (m == 1) ret = ret * (*this);
  }
  return ret;
}
bool BigNum::operator>(const BigNum &T) const {
  int ln;
  if (len > T.len)
    return true;
  else if (len == T.len) {
    ln = len - 1;
    while (a[ln] == T.a[ln] && ln >= 0) ln--;
    if (ln >= 0 && a[ln] > T.a[ln])
      return true;
    else
      return false;
  } else
    return false;
}
bool BigNum::operator>(const int &t) const {
  BigNum b(t);
  return *this > b;
}
void BigNum::print() {
  int i;
  cout << a[len - 1];
  for (i = len - 2; i >= 0; i--) {
    cout.width(4);
    cout.fill('0');
    cout << a[i];
  }
  cout << endl;
}
const int maxn = 705;
struct graph_node {
  int next, to;
} graph[maxn * 2];
int head[maxn], tot_len = 0, n;
BigNum f[maxn][maxn];
int tot[maxn];
void addedge(int p1, int p2) {
  graph[tot_len].next = head[p1];
  graph[tot_len].to = p2;
  head[p1] = tot_len++;
}
void DFS(int p, int fa) {
  f[p][1] = 1;
  tot[p] = 1;
  for (int i = head[p]; i != -1; i = graph[i].next) {
    int v = graph[i].to;
    if (v == fa) continue;
    DFS(v, p);
    for (int i = tot[p]; i >= 1; i--) {
      for (int j = tot[v]; j >= 0; j--) {
        if (f[p][i] * f[v][j] > f[p][i + j]) f[p][i + j] = f[p][i] * f[v][j];
      }
    }
    tot[p] += tot[v];
  }
  for (int i = 1; i <= tot[p]; i++)
    if (f[p][i] * i > f[p][0]) f[p][0] = f[p][i] * i;
}
int main() {
  cin >> n;
  memset(head, -1, sizeof(head));
  for (int i = 0; i < n - 1; i++) {
    int p1, p2;
    cin >> p1 >> p2;
    p1--, p2--;
    addedge(p1, p2);
    addedge(p2, p1);
  }
  DFS(0, -1);
  cout << f[0][0] << endl;
  return 0;
}

```