#include <bits/stdc++.h>
using namespace std;
struct edge {
  int to, next;
} e[6005];
int n, m, head[3005], d[3005], d2[3005], num, c;
bool ok[3005];
queue<int> q;
double ans;
inline void insert(int u, int v) {
  e[++num].to = v;
  e[num].next = head[u];
  head[u] = num;
  e[++num].to = u;
  e[num].next = head[v];
  head[v] = num;
}
inline void dfs(int now) {
  ok[now] = true;
  for (int i = head[now]; i; i = e[i].next)
    if (!ok[e[i].to]) {
      d2[e[i].to] = d2[now] + 1;
      if (d[e[i].to] == 0) {
        d[e[i].to] = d[now] + 1;
        ans += 1.0 / d[e[i].to];
      } else {
        ans +=
            1.0 / d2[e[i].to] - 1.0 / ((d[e[i].to] + d2[e[i].to] + c) / 2 - 1);
      }
      dfs(e[i].to);
    }
  ok[now] = false;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u++;
    v++;
    d[u]++;
    d[v]++;
    insert(u, v);
  }
  c = n;
  for (int i = 1; i <= n; i++)
    if (d[i] == 1) {
      q.push(i);
      c--;
    }
  while (!q.empty()) {
    int now = q.front();
    q.pop();
    for (int i = head[now]; i; i = e[i].next) {
      d[e[i].to]--;
      if (d[e[i].to] == 1) {
        q.push(e[i].to);
        c--;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    memset(d, 0, sizeof(d));
    memset(d2, 0, sizeof(d2));
    d[i] = d2[i] = 1;
    dfs(i);
  }
  ans += n;
  printf("%.6lf\n", ans);
  return 0;
}
