#include using namespace std; using ll = long long; #define ALL(v) v.begin(),v.end() #define dbg(x) cerr << #x << ": " << (x) << endl; template ostream& operator<<(ostream& os, pair& p) { os << '(' << p.first << ',' << p.second << ')'; return os; } template void print(Iter beg, Iter end) { for (Iter itr = beg; itr != end; ++itr) { cerr << *itr << ' '; } cerr << '\n'; } class BIT { public: BIT(int n) : n(n), d(n+1,0) { } // index番目にvalを加える void add(int index, ll val) { assert(0 <= index && index < n); ++index; for (int x = index; x <= n; x += x & -x) { d[x] += val; } } // [0, index)の総和 ll sum(int index) { ll ret = 0; for (int x = index; x > 0; x -= x & -x) { ret += d[x]; } return ret; } // [l, r)の総和 ll sum(int l, int r) { l = max(0, l); r = min(r, n); return sum(r) - sum(l); } private: int n; vector d; }; int n; vector x, y; int main() { cin >> n; x.resize(n); y.resize(n); for (int i = 0; i < n; ++i) cin >> x[i] >> y[i]; vector ord(n); iota(ALL(ord), 0); ll p = 0, q=0, r=0, s=0; { sort(ALL(ord), [](int a, int b) { return y[a] < y[b]; }); ll now = -1e18; int cnt = 0; for (int i : ord) { if (y[i] == now) { ++cnt; } else { q += ll(n - cnt) * cnt; now = y[i]; cnt = 1; } } q += ll(n - cnt) * cnt; assert(q % 2 == 0); q /= 2; dbg(q); } { sort(ALL(ord), [](int a, int b) { return x[a] < x[b]; }); ll now = -1e18; int cnt = 0; for (int i : ord) { if (x[i] == now) { ++cnt; } else { p += cnt * ll(n - cnt); now = x[i]; cnt = 1; } } p += cnt * ll(n - cnt); assert(p % 2 == 0); p /= 2; dbg(p); } { auto tmp = y; sort(ALL(tmp)); tmp.erase(unique(ALL(tmp)), tmp.end()); for (int i = 0; i < n; ++i) y[i] = lower_bound(ALL(tmp), y[i]) - tmp.begin(); BIT bit(tmp.size()); vector add; ll now = 1e18; for (int i : ord) { if (x[i] == now) { add.push_back(y[i]); } else { for (int j : add) { bit.add(j, 1); } add.clear(); now = x[i]; add.push_back(y[i]); } r += bit.sum(0, y[i]); s += bit.sum(y[i]+1, tmp.size()); } dbg(r) dbg(s) } double ans = (r - s) / (sqrt(p) * sqrt(q)); cout << fixed << setprecision(20) << ans << '\n'; }