Problem: Ksusha is a vigorous mathematician. She is keen on absolutely incredible mathematical riddles. 

Today Ksusha came across a convex polygon of non-zero area. She is now wondering: if she chooses a pair of distinct points uniformly among all integer points (points with integer coordinates) inside or on the border of the polygon and then draws a square with two opposite vertices lying in the chosen points, what will the expectation of this square's area be?

A pair of distinct points is chosen uniformly among all pairs of distinct points, located inside or on the border of the polygon. Pairs of points p, q (p ≠ q) and q, p are considered the same.

Help Ksusha! Count the required expectation.

Input

The first line contains integer n (3 ≤ n ≤ 105) — the number of vertices of Ksusha's convex polygon. Next n lines contain the coordinates of the polygon vertices in clockwise or counterclockwise order. The i-th line contains integers xi, yi (|xi|, |yi| ≤ 106) — the coordinates of the vertex that goes i-th in that order.

Output

Print a single real number — the required expected area. 

The answer will be considered correct if its absolute and relative error doesn't exceed 10 - 6.

Examples

Input

3
0 0
5 5
5 0


Output

4.6666666667


Input

4
-1 3
4 5
6 2
3 -5


Output

8.1583333333


Input

3
17 136
859 937
16 641


Output

66811.3704155169

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
struct point {
  int x, y;
};
int n;
point p[100020];
double totcnt;
double sdsq() {
  int mxx = p[0].x;
  int bi = 0;
  for (int i = 1; i < n; ++i) {
    if (p[i].x < p[bi].x) bi = i;
    mxx = max(mxx, p[i].x);
  }
  int lo, hi;
  lo = hi = bi;
  int lpr = lo - 1;
  if (lpr < 0) lpr += n;
  int hne = hi + 1;
  if (hne >= n) hne -= n;
  while (p[lpr].x == p[lo].x) {
    lo = lpr;
    --lpr;
    if (lpr < 0) lpr += n;
  }
  while (p[hne].x == p[hi].x) {
    hi = hne;
    ++hne;
    if (hne >= n) hne -= n;
  }
  double ymi = min(p[hi].y, p[lo].y);
  double ymx = max(p[hi].y, p[lo].y);
  double ans = 0.0;
  double spr = 0;
  double tot = 0;
  double cx = p[hi].x;
  while (cx <= mxx) {
    double yx, yi;
    if (cx == p[hne].x) {
      hi = hne;
      ++hne;
      if (hne >= n) hne -= n;
      while (p[hne].x == p[hi].x) {
        hi = hne;
        ++hne;
        if (hne >= n) hne -= n;
      }
    }
    if (cx == p[lpr].x) {
      lo = lpr;
      --lpr;
      if (lpr < 0) lpr += n;
      while (p[lpr].x == p[lo].x) {
        lo = lpr;
        --lpr;
        if (lpr < 0) lpr += n;
      }
    }
    double a, b, c;
    a = p[hi].y - p[hne].y;
    b = p[hne].x - p[hi].x;
    c = -a * p[hi].x - b * p[hi].y;
    yx = (-c - a * cx) / b;
    a = p[lo].y - p[lpr].y;
    b = p[lpr].x - p[lo].x;
    c = -a * p[lo].x - b * p[lo].y;
    yi = (-c - a * cx) / b;
    ymi = (int)ceil(min(yx, yi));
    ymx = (int)floor(max(yx, yi));
    double cnt = ymx - ymi + 1;
    ans += (double)(totcnt - cnt) * cnt * cx * cx;
    ans -= 2.0 * (double)spr * cnt * cx;
    tot += cnt;
    spr += cnt * cx;
    ++cx;
  }
  totcnt = tot;
  return ans;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d %d", &p[i].x, &p[i].y);
  }
  sdsq();
  double sm = sdsq();
  for (int i = 0; i < n; i++) {
    swap(p[i].x, p[i].y);
  }
  sm += sdsq();
  printf("%.10lf\n", sm / ((double)totcnt) / ((double)totcnt - 1.0));
  return 0;
}