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>
char ch;
inline void read(int &x) {
  x = 0;
  ch = getchar();
  while (ch <= 32) ch = getchar();
  int f = 1;
  if (ch == '-') f = -1, ch = getchar();
  while (ch > 32) x = x * 10 + ch - 48, ch = getchar();
  x *= f;
}
template <class T>
inline void swap(T &a, T &b) {
  T t = a;
  a = b;
  b = t;
}
template <class T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T min(T a, T b) {
  return a < b ? a : b;
}
int n;
int X[100005], Y[100005];
int L[2000010], U[2000010];
inline int floordiv(long long a, int b) {
  return a / b - (a < 0 && a % b != 0);
}
inline void add(int x1, int y1, int x2, int y2) {
  if (x1 > x2) swap(x1, x2), swap(y1, y2);
  if (x1 == x2) {
    L[x1] = min(L[x1], min(y1, y2));
    U[x1] = max(U[x1], max(y1, y2));
    return;
  }
  int i;
  for (i = x1; i <= x2; i++) {
    int yU = floordiv(1LL * (i - x1) * (y2 - y1), (x2 - x1)) + y1;
    int yL = yU + (1LL * (i - x1) * (y2 - y1) % (x2 - x1) != 0);
    L[i] = min(L[i], yL);
    U[i] = max(U[i], yU);
  }
}
inline double calc() {
  int i;
  long long cnt = 0;
  double sx = 0;
  double sx2 = 0;
  double ret = 0;
  for (i = 1; i <= 2000005; i++) {
    if (L[i] > U[i]) continue;
    int k = U[i] - L[i] + 1;
    ret += k * ((double)i * i * cnt + sx2 - 2.0 * i * sx);
    sx += 1LL * k * i;
    sx2 += 1LL * k * i * i;
    cnt += k;
  }
  return ret / ((double)cnt * (cnt - 1));
}
inline double solvex() {
  int i;
  for (i = 1; i <= 2000005; i++) {
    L[i] = 0x3f3f3f3f, U[i] = -0x3f3f3f3f;
  }
  for (i = 1; i <= n; i++) {
    add(X[i], Y[i], X[i - 1], Y[i - 1]);
  }
  return calc();
}
inline double solvey() {
  int i;
  for (i = 1; i <= 2000005; i++) {
    L[i] = 0x3f3f3f3f, U[i] = -0x3f3f3f3f;
  }
  for (i = 1; i <= n; i++) {
    add(Y[i], X[i], Y[i - 1], X[i - 1]);
  }
  return calc();
}
int main() {
  read(n);
  int i;
  for (i = 1; i <= n; i++) {
    read(X[i]);
    read(Y[i]);
    X[i] += 1000003;
    Y[i] += 1000003;
  }
  X[0] = X[n];
  Y[0] = Y[n];
  printf("%.10lf\n", solvex() + solvey());
}