/**
Problem C Friends
题意:给n个人,有n-1个朋友关系,形成一棵树,如果两个人能够通过不超过5个人可以联系到,那么那两个人也是朋友,问你每个人有多少个朋友,
比如(1-2-3-4-5-6-7-8),1可以联系到2 3 4 5 6 7,所以1有6个朋友
思路:先对树进行dfs搜索形成有向树,根节点为1(任意),在设son[o][i]表示以o为节点在通过恰好i个人联系可以成为朋友的个数,只计算在根为o的子树中
的结果,那么设p1,p2,p3,p4,p5,p6为o的一级祖先、二级祖先、..六级祖先那么对于节点o来说,
不通过p1能成为朋友的个数为 sigma {son[o][i] | 0 <= i <= 6}, 计算的是包含o节点的
不通过p2而通过p1能成为朋友的个数为 sigma {son[p1][i] | 0 <= i <= 5}
但是这里再次计算了经过o的情况, 所以需要减去 sigma {son[p1][i] | 0 <= i <= 4}
同理需要经过Pj祖先的时候, 总个数为 sigma {son[Pj][i] | 0 <= i <= 6 - j}
但是不能再通过Pj-1, 所以减去 sigma {son[Pj-1][i] | 0 <= i <= 6 - j - 1}
所有pj的结果加起来再减去1就是答案了, 因为把o节点自己计算了在内
**/
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
const int maxn = 1e5 + 10;
using namespace std;
int T, n, kase = 1;
int pre[maxn];
vector<int> G[maxn];
int son[maxn][7];
int que[10];
void dfs(int fa[7], int u) {
int fat = fa[5];
pre[u] = fat;
for(int i = 0; i <= 5; i++) {
int f = fa[i];
son[f][6 - i]++;
}
int nf[7] = {fa[1], fa[2], fa[3], fa[4], fa[5], u};
for(int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if(v == fat) continue;
dfs(nf, v);
}
}
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
memset(son, 0, sizeof son);
for(int i = 0; i <= n; i++) {
son[i][0] = 1;
G[i].clear();
for(int j = 1; j < 7; j++) son[i][j] = 0;
}
for(int i = 1; i < n; i++) {
int u, v;
scanf("%d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
int f[7] = {0, 0, 0, 0, 0, 0};
dfs(f, 1);
printf("Case #%d:\n", kase++);
for(int i = 1; i <= n; i++) {
int ans = 0;
for(int j = 0; j <= 6; j++) ans += son[i][j];
int u = i;
for(int j = 1; j <= 6; j++) {
int v = u; u = pre[u];
if(u == 0) break;
for(int k = 0; k <= 6 - j; k++) ans += son[u][k];
for(int k = 0; k <= 6 - j - 1; k++) ans -= son[v][k];
}
printf("%d\n", ans - 1);
}
}
return 0;
}