
最裸的点分治+fft,调了好久,太菜了。。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=,inf=1e9;
const double pi=acos(-);
int f[maxn],t,last[maxn],pre[maxn],other[maxn],siz[maxn],vis[maxn];
int mi,root,rev[maxn],dep,N,n,p[maxn],tot,is[maxn];
ll sum[maxn],c[maxn],cnt[maxn];
void add(int x,int y){++t;pre[t]=last[x];last[x]=t;other[t]=y;}
void getroot(int x,int fa,int ac){
f[x]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(vis[v]||v==fa)continue;
getroot(v,x,ac);
f[x]=max(f[x],siz[v]);
}
f[x]=max(siz[ac]-siz[x],f[x]);//注意这里是siz[ac]而不是n;
if(f[x]<mi){mi=f[x];root=x;}
}
void dfs(int x,int fa,int d){
c[d]++;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(vis[v]||v==fa)continue;
dfs(v,x,d+);
}
}
struct cp{
double r,i;
cp operator+(cp&t){cp tp;tp.r=r+t.r;tp.i=i+t.i;return tp;}
cp operator-(cp&t){cp tp;tp.r=r-t.r;tp.i=i-t.i;return tp;}
cp operator*(cp&t){cp tp;tp.r=r*t.r-i*t.i;tp.i=t.r*i+t.i*r;return tp;}
}A[maxn],B[maxn],tmp[maxn],wn,w,x,y;
void fft(cp a[],int n,int flag){
for(int i=;i<n;++i){
rev[i]=rev[i>>]>>;
if(i&)rev[i]|=(n>>);
}
for(int i=;i<n;++i)tmp[i]=a[rev[i]];
for(int i=;i<n;++i)a[i]=tmp[i];
for(int i=;i<=n;i<<=){
wn.r=cos(*pi/i);wn.i=flag*sin(*pi/i);
for(int j=;j<n;j+=i){
w.r=;w.i=;
for(int k=j;k<j+i/;++k){
x=a[k];y=a[k+i/]*w;
a[k]=x+y;a[k+i/]=x-y;
w=w*wn;
}
}
}
if(flag==-)for(int i=;i<n;++i)a[i].r/=n;
}
void Siz(int x,int fa){
siz[x]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(v==fa||vis[v])continue;
Siz(v,x);
siz[x]+=siz[v];
}
}
void calc(ll a[],int n,int flag){
for(int i=;i<n;++i)A[i].r=a[i],A[i].i=;
for(int i=;i<n;++i)B[i].r=a[i],B[i].i=;
fft(A,n,);
fft(B,n,);
for(int i=;i<n;++i)A[i]=A[i]*B[i];
fft(A,n,-);
for(int i=;i<n;++i)sum[i]+=flag*(ll)(A[i].r+0.3);
}
void solve(int x){
mi=1e9;
ll res=;
Siz(x,);
for(N=;N<=siz[x];N<<=);
for(int i=;i<N;++i)cnt[i]=;
cnt[]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(vis[v])continue;
for(N=;N<=*siz[v];N<<=);
for(int j=;j<N;++j)c[j]=;
dfs(v,x,);
calc(c,N,-);
for(int j=;j<N;++j)cnt[j]+=c[j];
}
for(N=;N<=siz[x];N<<=);
calc(cnt,N,);
/*for(int i=0;i<n;++i)cout<<A[i].r<<' ';
cout<<endl;*/
sum[]=;
}
void divont(int x){
mi=1e9;
Siz(x,);
getroot(x,,x);
int u=root;
//cout<<u<<endl;
solve(u);
vis[u]=;
for(int i=last[u];i;i=pre[i]){
int v=other[i];
if(!vis[v])divont(v);
}
}
int main(){
cin>>n;
int x,y;
for(int i=;i<n;++i){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
divont();
for(int i=;i<=;++i){
if(!is[i]){p[++tot]=i;}
for(int j=;j<=tot&&i*p[j]<=;++j){
is[i*p[j]]=;
if(i%p[j]==)break;
}
}
double mu=(double)n*(n-)/,res=;
for(int i=;i<=tot&&p[i]<=n;++i){
res+=sum[p[i]];
}
res/=;
printf("%.7lf",double(res)/double(mu));
return ;
}