#include <bits/stdc++.h>
using namespace std;
const int N = 3005;
struct _two {
  int a, b;
} edge[N + N], p[N];
double ans;
int n, tot, num, pos, tnum;
int st[N], flag[N], stack[N], qu[N], tqu[N];
void Init() {
  scanf("%d", &n);
  int x, y;
  tot = 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &x, &y);
    x++;
    y++;
    edge[++tot] = (_two){y, st[x]};
    st[x] = tot;
    edge[++tot] = (_two){x, st[y]};
    st[y] = tot;
  }
}
bool Find_cir(int x, int fa) {
  flag[x] = 1;
  for (int i = st[x]; i; i = edge[i].b)
    if (i != fa) {
      if (flag[edge[i].a]) {
        pos = edge[i].a;
        qu[num = 1] = x;
        return 1;
      } else if (Find_cir(edge[i].a, i ^ 1)) {
        qu[++num] = x;
        return x != pos;
      }
    }
  flag[x] = 0;
  return 0;
}
void dfs(int x, int fa) {
  tqu[++tnum] = x;
  for (int i = st[x]; i; i = edge[i].b)
    if (!flag[edge[i].a] && i != fa) {
      p[edge[i].a] = (_two){p[x].a, p[x].b + 1};
      dfs(edge[i].a, i ^ 1);
    }
}
void Calc(int x, int fa, int d) {
  ans += 1.0 / d;
  for (int i = st[x]; i; i = edge[i].b)
    if (!flag[edge[i].a] && i != fa) Calc(edge[i].a, i ^ 1, d + 1);
}
void Work() {
  Find_cir(1, 0);
  for (int i = 1; i <= num; i++) {
    tnum = 0;
    p[qu[i]] = (_two){i, 0};
    dfs(qu[i], 0);
    for (int j = 1; j <= tnum; j++) Calc(tqu[j], 0, 1);
  }
  for (int i = 1; i <= n; i++) {
    if (p[i].b) ans += 1.0 / (p[i].b + 1);
    for (int j = 1; j <= n; j++)
      if (p[i].a != p[j].a) {
        int len = ((p[i].a - p[j].a) > 0 ? (p[i].a - p[j].a)
                                         : -(p[i].a - p[j].a)),
            ful = num + p[i].b + p[j].b;
        ans += 1.0 / (ful - len + 1) + 1.0 / (ful - num + len + 1) - 1.0 / ful;
      }
  }
  printf("%.7lf\n", ans);
}
int main() {
  Init();
  Work();
  return 0;
}
