// #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i, l, r) for(int i=l; i<=r; i++) #define dow(i, l, r) for(int i=l; i>=r; i--) #define fi first #define se second #define pb push_back #define mp make_pair #define clr(x, c) memset(x,c,sizeof(x)) typedef long long ll; typedef unsigned long long ull; typedef pair Pii; inline int read() { int x=0,f=0; char ch=getchar(); while (ch<'0' || '9'n) struct edge{int y; edge *n;} e[maxm], *fir[maxn], *pt=e; inline void initEdge() { clr(fir,0); pt=e; } inline void addEdge(int x, int y) { pt->y=y, pt->n=fir[x], fir[x]=pt++; pt->y=x, pt->n=fir[y], fir[y]=pt++; } // =========================== 快速幂 // inline int pow(int x, int t) { // int g = 1; // while (t) { // if (t&1) g = 1LL*g*x%Q; // x = 1LL*x*x%Q; // t >>= 1; // } // return g; // } // ====================================================== 主程序 int n, c[maxn]; int dis[maxn]; queueq; int main() { int T = read(); while (T--) { initEdge(); n = read(); rep(i, 1, n-1) addEdge(read(), read()); int ans = 0, ansnum = 0, ans2 = 0; rep(r, 1, n) if (fir[r]->n == 0) { rep(i, 1, n) dis[i] = -1, c[i-1] = 0; dis[r] = 0; q.push(r); while (!q.empty()) { int x = q.front(); q.pop(); travel(x) if (dis[p->y] == -1) { dis[p->y] = dis[x] + 1; q.push(p->y); } } int mxdis = 0, mxdisnum = 0; rep(i, 1, n) { if (dis[i] > mxdis) mxdis = dis[i], mxdisnum = 0; if (dis[i] == mxdis) mxdisnum += 1; c[dis[i]]++; } if (mxdis+1 > ans) ans = mxdis+1, ansnum = 0, ans2 = 0; if (mxdis+1 >= ans) { ll num = 1; rep(i, 0, n-1) if (c[i]) num = 1LL * num * c[i] % Q; num = (Q + num - mxdisnum) % Q; ansnum = (ansnum + num) % Q; ans2 += mxdisnum; } } ansnum = (ansnum + ans2 / 2) % Q; printf("%d %d\n", ans, ansnum); } return 0; }