#include #include using namespace std; using ll = long long; #define rep(i, n) for (int i = 0; i < (int)(n); i++) void solve() { ll n; cin >> n; vector> xy(n); rep(i, n) cin >> xy[i].first >> xy[i].second; sort(xy.begin(), xy.end()); vector pre(n, -1), nex(n, 1); rep(i, n) { while (xy[pre[i] + 1].first < xy[i].first) pre[i]++; while (nex[i] < n && xy[i].first == xy[nex[i]].first) nex[i]++; if (i < n - 1) pre[i + 1] = pre[i], nex[i + 1] = nex[i]; } priority_queue> que; map> yis; atcoder::fenwick_tree ft(n); rep(i, n) { ll y = xy[i].second; que.emplace(y, i); yis[y].push_back(i); } ll p = 0, q = 0, last_y = 1e18; while (!que.empty()) { auto [y, i] = que.top(); que.pop(); if (y < last_y) { for (const auto j : yis[last_y]) ft.add(j, 1); last_y = y; } if (pre[i] >= 0) { q += ft.sum(0, pre[i] + 1); } if (nex[i] <= n - 1) { p += ft.sum(nex[i], n); } } ll r = 0, s = 0; { ll rem = n; map cnt; rep(i, n) cnt[xy[i].first]++; for (const auto [k, v] : cnt) r += v * (rem - v), rem -= v; } { ll rem = n; map cnt; rep(i, n) cnt[xy[i].second]++; for (const auto [k, v] : cnt) s += v * (rem - v), rem -= v; } double ans = p - q; ans /= sqrt(double(r) * double(s)); cout << fixed << setprecision(16) << ans << '\n'; } int main() { std::cin.tie(nullptr); std::ios_base::sync_with_stdio(false); int T = 1; for (int t = 0; t < T; t++) { solve(); } return 0; }