A tree is an undirected graph with exactly one simple path between each pair of vertices. We call a set of simple paths k-valid if each vertex of the tree belongs to no more than one of these paths (including endpoints) and each path consists of exactly k vertices.

You are given a tree with n vertices. For each k from 1 to n inclusive find what is the maximum possible size of a k-valid set of simple paths.

Input

The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the number of vertices in the tree.

Then following n - 1 lines describe the tree, each of them contains two integers v, u (1 ≤ v, u ≤ n) — endpoints of the corresponding edge.

It is guaranteed, that the given graph is a tree. 

Output

Output n numbers, the i-th of which is the maximum possible number of paths in an i-valid set of paths.

Examples

Input

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


Output

7
3
2
1
1
1
1



Input

6
1 2
2 3
2 4
1 5
5 6


Output

6
2
2
1
1
0

Note

One way to achieve the optimal number of paths for the second sample is illustrated in the following picture:

<image>
#include <bits/stdc++.h>
using namespace std;
namespace io {
const int SIZE = (1 << 21) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c,
                                       qu[55];
int f, qr;
inline void flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
inline void putc(char x) {
  *oS++ = x;
  if (oS == oT) flush();
}
template <class I>
inline void read(I &x) {
  for (f = 1, c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                              (iS == iT ? EOF : *iS++))
                            : *iS++);
       c < '0' || c > '9';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    if (c == '-') f = -1;
  for (x = 0; c <= '9' && c >= '0';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    x = x * 10 + (c & 15);
  x *= f;
}
template <class I>
inline void print(I x) {
  if (!x) putc('0');
  if (x < 0) putc('-'), x = -x;
  while (x) qu[++qr] = x % 10 + '0', x /= 10;
  while (qr) putc(qu[qr--]);
}
struct Flusher_ {
  ~Flusher_() { flush(); }
} io_flusher_;
}  // namespace io
using io ::print;
using io ::putc;
using io ::read;
const int N = 1e5 + 5;
struct edge {
  int link, next;
} e[N << 1];
int n, tot, head[N];
inline void add_edge(int u, int v) {
  e[++tot] = (edge){v, head[u]};
  head[u] = tot;
}
inline void insert(int u, int v) {
  add_edge(u, v);
  add_edge(v, u);
}
int dp[N], ans[N], cnt;
void dfs(int u, int fa, int x) {
  dp[u] = 0;
  int mx1 = 0, mx2 = 0;
  for (int i = head[u]; i; i = e[i].next) {
    int v = e[i].link;
    if (v != fa) {
      dfs(v, u, x);
      if (dp[v] > mx1)
        mx2 = mx1, mx1 = dp[v];
      else
        mx2 = max(mx2, dp[v]);
    }
  }
  if (mx1 + mx2 + 1 >= x)
    dp[u] = 0, cnt++;
  else
    dp[u] = mx1 + 1;
}
void sol(int l, int r, int L, int R) {
  if (l > r || L > R) return;
  if (L == R) {
    for (int i = l; i <= r; i++) ans[i] = L;
    return;
  }
  int mid = (l + r) >> 1;
  cnt = 0;
  dfs(1, 0, mid);
  ans[mid] = cnt;
  sol(l, mid - 1, cnt, R);
  sol(mid + 1, r, L, cnt);
}
int main() {
  int i, j, k;
  read(n);
  for (int i = 1; i < n; i++) {
    int u, v;
    read(u), read(v);
    insert(u, v);
  }
  sol(1, n, 0, n);
  for (int i = 1; i <= n; i++) print(ans[i]), putc('\n');
  return 0;
}
