#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int odd=0;

struct diameter{
	static const int MAX=105;
	static const int INF=100000;
	vector<int> G[MAX];
	int n;
	int d[MAX];
	bool vis[MAX];
	int d2[2][MAX];

	void bfs(int s){
		fill(d,d+n,INF);
		queue<int> que;
		que.push(s);
		d[s]=0;
		int v=0;
		while(que.size()){
			v=que.front();
			que.pop();
			for(int i=0;i<G[v].size();i++){
				int e=G[v][i];
				if(d[e]==INF){
					d[e]=d[v]+1;
					odd=max(d[e],odd);
					que.push(e);
				}
			}
		}
	}

	P diameter_point(int s=0){
		bfs(s);
		int maxv=0;
		int tgt=0;
		for(int i=0;i<n;i++){
			if(d[i]==INF)continue;
			if(maxv<d[i]){
				maxv=d[i];
				tgt=i;
			}
		}
		bfs(tgt);
		maxv=0;
		int v=0;
		for(int i=0;i<n;i++){
			if(d[i]==INF)continue;
			if(maxv<d[i]){
				maxv=d[i];
				v=i;
			}
		}
		return P(tgt,v);
	}
	vector<int> middle_points(P p){
		bfs(p.first);
		for(int i=0;i<n;i++){
			d2[0][i]=d[i];
		}
		bfs(p.second);
		for(int i=0;i<n;i++){
			d2[1][i]=d[i];
		}
		vector<int> cid;
		if(d2[0][p.second]%2==0){
			for(int i=0;i<n;i++){
				if(d2[0][p.second]==d2[0][i]*2 && d2[1][p.first]==d2[1][i]*2){
					cid.push_back(i);
				}
			}
		}else{
			for(int i=0;i<n;i++){
				if(d2[0][p.second]==(d2[0][i]+d2[1][i]) && abs(d2[0][i]-d2[1][i])==1){
					cid.push_back(i);
				}
			}
		}
		return cid;
	}
};

int n;
diameter di;
vector<int> G[105];
int dist[105];

ll solve(int v1,int v2,int ansv){
	for(int i=0;i<n;i++){
		dist[i]=10005;
	}
	queue<int> que;
	que.push(v1);
	dist[v1]=0;
	while(que.size()){
		int v=que.front();
		que.pop();
		for(int i=0;i<G[v].size();i++){
			if(dist[G[v][i]]>dist[v]){
				dist[G[v][i]]=dist[v]+1;
				que.push(G[v][i]);
			}
		}
	}
	que.push(v2);
	dist[v2]=0;
	while(que.size()){
		int v=que.front();
		que.pop();
		for(int i=0;i<G[v].size();i++){
			if(dist[G[v][i]]>dist[v]){
				dist[G[v][i]]=dist[v]+1;
				que.push(G[v][i]);
			}
		}
	}
	ll cnt=0;
	for(int i=0;i<n;i++){
		if(dist[i]==0)cnt++;
	}
	for(int i=0;i<ansv;i++){
		ll maxi=0;
		for(int j=0;j<n;j++){
			ll tp=0;
			for(int k=0;k<G[j].size();k++){
				if(dist[G[j][k]]==i+1)tp++;
			}
			maxi=max(tp,maxi);
		}
		cnt*=maxi;
	}
	return cnt;
}

int main(void){
	scanf("%d",&n);
	di.n=n;
	for(int i=0;i<n-1;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		a--;
		b--;
		G[a].push_back(b);
		G[b].push_back(a);
		di.G[a].push_back(b);
		di.G[b].push_back(a);
	}
	P dia=di.diameter_point();
	vector<int> mi=di.middle_points(dia);
	for(int i=0;i<n;i++){
		dist[i]=10005;
	}
	for(int i=0;i<mi.size();i++){
		queue<int> que;
		que.push(mi[i]);
		dist[mi[i]]=0;
		while(que.size()){
			int v=que.front();
			que.pop();
			for(int i=0;i<G[v].size();i++){
				if(dist[G[v][i]]>dist[v]){
					dist[G[v][i]]=dist[v]+1;
					que.push(G[v][i]);
				}
			}
		}
	}
	odd%=2;
	int ansv=0;
	ll cnt=0;
	for(int i=0;i<n;i++){
		ansv=max(ansv,dist[i]);
	}
	for(int i=0;i<n;i++){
		if(dist[i]==0)cnt++;
	}
	for(int i=0;i<ansv;i++){
		ll maxi=0;
		for(int j=0;j<n;j++){
			ll tp=0;
			for(int k=0;k<G[j].size();k++){
				if(dist[G[j][k]]==i+1)tp++;
			}
			maxi=max(tp,maxi);
		}
		cnt*=maxi;
	}
	if(odd==0){
		for(int i=0;i<G[mi[0]].size();i++){
			cnt=min(cnt,solve(mi[0],G[mi[0]][i],ansv));
		}
	}
	printf("%d %lld\n",ansv+1,cnt);
	return 0;
}

Measured memory_bytes: 256