// Author -- Frame

#include<bits/stdc++.h>

#define lowbit(x) ((x)&(-(x)))
#define Finline __inline__ __attribute__ ((always_inline))
#define DEBUG fprintf(stderr,"Running on Line %d in Function %s\n",__LINE__,__FUNCTION__)
#define SZ(x) ((int)x.size())
#define mkpr std::make_pair
#define pb push_back

typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef std::pair<int,int> pi;
typedef std::pair<ll,ll> pl;
using std::min;
using std::max;

const int inf=0x3f3f3f3f,Inf=0x7fffffff;
const ll INF=0x3f3f3f3f3f3f3f3f;

Finline uint rnd(){static uint seed=416;return seed^=seed>>5,seed^=seed<<17,seed^=seed>>13;}
template <typename _Tp>_Tp gcd(const _Tp &a,const _Tp &b){return (!b)?a:gcd(b,a%b);}
template <typename _Tp>Finline _Tp abs(const _Tp &a){return a>=0?a:-a;}
template <typename _Tp>Finline void chmax(_Tp &a,const _Tp &b){(a<b)&&(a=b);}
template <typename _Tp>Finline void chmin(_Tp &a,const _Tp &b){(b<a)&&(a=b);}
template <typename _Tp>Finline void read(_Tp &x)
{
	char ch(getchar());bool f(false);while(!isdigit(ch)) f|=ch==45,ch=getchar();
	x=ch&15,ch=getchar();while(isdigit(ch)) x=(((x<<2)+x)<<1)+(ch&15),ch=getchar();
	f&&(x=-x);
}
template <typename _Tp,typename... Args>Finline void read(_Tp &t,Args &...args){read(t);read(args...);}
template <typename _Tp,typename... Args>Finline _Tp min(const _Tp &a,const _Tp &b,const Args &...args){return a<b?min(a,args...):min(b,args...);}
template <typename _Tp,typename... Args>Finline _Tp max(const _Tp &a,const _Tp &b,const Args &...args){return a<b?max(b,args...):max(a,args...);}
Finline int read_str(char *s)
{
	char ch(getchar());while(ch==' '||ch=='\r'||ch=='\n') ch=getchar();
	char *tar=s;*tar=ch,ch=getchar();while(ch!=' '&&ch!='\r'&&ch!='\n'&&ch!=EOF) *(++tar)=ch,ch=getchar();
	return tar-s+1;
}

const int N=105;
struct edge{
	int v,nxt;
}c[N<<1];
int front[N],edge_cnt;
Finline void addedge(int u,int v)
{
	c[++edge_cnt]=(edge){v,front[u]};
	front[u]=edge_cnt;
}
int maxx,nd;
void dfs(int x,int fa,int len)
{
	++len;
	if(len>maxx) maxx=len,nd=x;
	for(int i=front[x];i;i=c[i].nxt)
	{
		int v=c[i].v;
		if(v!=fa) dfs(v,x,len);
	}
}
int tar;
std::vector<int> res;
void getpath(int x,int fa,std::vector<int> cur)
{
	cur.pb(x);
	if(x==tar)
	{
		res=cur;
		return;
	}
	for(int i=front[x];i;i=c[i].nxt)
	{
		int v=c[i].v;
		if(v!=fa) getpath(v,x,cur);
	}
}
int dep[N],son[N],qwq[N],n;
int max_dep;
void getdep(int x,int fa,int _)
{
	dep[x]=++_,son[x]=0;
	chmax(max_dep,dep[x]);
	for(int i=front[x];i;i=c[i].nxt)
	{
		int v=c[i].v;
		if(v!=fa) getdep(v,x,_),++son[x];
	}
}
std::pair<int,ll> calc(int x,int y)
{
	max_dep=0;
	getdep(x,y,0),getdep(y,x,0);
	for(int i=0;i<=max_dep;++i) qwq[i]=1;
	for(int i=1;i<=n;++i) chmax(qwq[dep[i]],son[i]);
	ll ans=1;
	for(int i=0;i<=max_dep;++i) ans*=qwq[i];
	return mkpr(max_dep,ans*2);
}
int main()
{
	read(n);int x,y;
	for(int i=1;i<n;++i)
	{
		read(x,y);
		addedge(x,y),addedge(y,x);
	}
	nd=0,maxx=0;
	dfs(1,0,-1);
	int nd1=nd;
	nd=0,maxx=0;
	dfs(nd1,0,-1);
	int nd2=nd;
	tar=nd2;res.clear();
	getpath(nd1,0,std::vector<int>());
	if(maxx&1)
	{
		std::pair<int,ll> ans=calc(res[SZ(res)>>1],res[(SZ(res)>>1)-1]);
		printf("%d %lld\n",ans.first,ans.second);
	}
	else
	{
		max_dep=0;
		int pt=res[SZ(res)>>1];
		getdep(pt,0,0);
		for(int i=0;i<=max_dep;++i) qwq[i]=1;
		for(int i=1;i<=n;++i) if(i!=pt) chmax(qwq[dep[i]],son[i]);
		ll ans=1;
		for(int i=0;i<=max_dep;++i) ans*=qwq[i];
		std::pair<int,ll> _=mkpr(max_dep,ans*son[pt]);
		for(int i=front[pt];i;i=c[i].nxt) _=min(_,calc(pt,c[i].v));
		printf("%d %lld\n",_.first,_.second);
	}
	return 0;
}


Measured memory_bytes: 3748