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 int MAXN = 100100;
struct Point {
  long long x, y;
  bool operator<(const Point& o) const { return x < o.x; }
};
long long floor(long long a, long long b) {
  return a >= 0 ? a / b : (a - b + 1) / b;
}
long long ceil(long long a, long long b) {
  return a >= 0 ? (a + b - 1) / b : a / b;
}
long long floor(const Point& a, const Point& b, long long x) {
  return a.y + floor((b.y - a.y) * (x - a.x), b.x - a.x);
}
long long ceil(const Point& a, const Point& b, long long x) {
  return a.y + ceil((b.y - a.y) * (x - a.x), b.x - a.x);
}
double gao(vector<Point> v) {
  int n = v.size();
  int x1 = min_element(v.begin(), v.end())->x;
  int x2 = max_element(v.begin(), v.end())->x;
  vector<Point> y1, y2;
  rotate(v.begin(), min_element(v.begin(), v.end()), v.end());
  for (int i = 1;; ++i) {
    if (y1.empty()) {
      if (v[i].x > x1) {
        y1.push_back(v[i - 1]);
      } else {
        continue;
      }
    }
    y1.push_back(v[i]);
    if (v[i].x == x2) {
      break;
    }
  }
  for (int i = n - 1;; --i) {
    if (y2.empty()) {
      if (v[i].x > x1) {
        y2.push_back(v[(i + 1) % n]);
      } else {
        continue;
      }
    }
    y2.push_back(v[i]);
    if (v[i].x == x2) {
      break;
    }
  }
  if (y1[0].y > y2[0].y || (y1[0].y == y2[0].y && y1[1].y > y2[1].y)) {
    swap(y1, y2);
  }
  vector<long long> x(x2 - x1 + 1, 0);
  int k1 = 1, k2 = 1;
  for (int i = x1; i <= x2; ++i) {
    if (y1[k1].x < i) {
      ++k1;
    }
    if (y2[k2].x < i) {
      ++k2;
    }
    x[i - x1] = floor(y2[k2 - 1], y2[k2], i) - ceil(y1[k1 - 1], y1[k1], i) + 1;
  }
  long long cnt = 0, sx = 0;
  for (int i = 0; i < (int)x.size(); ++i) {
    cnt += x[i];
    sx += i * x[i];
  }
  double sum = 0;
  for (int i = 0; i < (int)x.size(); ++i) {
    sum += (cnt - 1.0) * x[i] * i * i;
    sum -= 1.0 * x[i] * i * (sx - i);
  }
  return sum / cnt / (cnt - 1);
}
int main() {
  int n, x, y;
  double ans = 0;
  vector<Point> v;
  scanf("%d", &n);
  v.resize(n);
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", &x, &y);
    v[i].x = x;
    v[i].y = y;
  }
  ans = gao(v);
  for (int i = 0; i < n; ++i) {
    swap(v[i].x, v[i].y);
  }
  ans += gao(v);
  printf("%.10lf\n", ans);
  return 0;
}