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 MaxXL = 1000000;
const int MaxN = 100000;
inline long long floor(long long a, long long b) {
  if (b < 0) a = -a, b = -b;
  if (a > 0) return a / b;
  return -((-a + b - 1) / b);
}
inline long long ceil(long long a, long long b) { return -floor(-a, b); }
double calc(int n, int *px, int *py) {
  long long area = 0;
  for (int i = 0; i < n; i++)
    area += (long long)px[i] * py[i + 1] - (long long)py[i] * px[i + 1];
  if (area < 0) reverse(px + 1, px + n), reverse(py + 1, py + n);
  static int h[MaxXL * 2 + 1];
  fill(h, h + MaxXL * 2 + 1, 0);
  for (int i = 0; i < n; i++) {
    if (px[i] < px[i + 1]) {
      for (int x = px[i]; x < px[i + 1]; x++)
        h[x + MaxXL] -= py[i] +
                        ceil((long long)(py[i + 1] - py[i]) * (x - px[i]),
                             px[i + 1] - px[i]) -
                        1;
      if (px[i + 1] >= px[(i + 2) % n]) h[px[i + 1] + MaxXL] -= py[i + 1] - 1;
    } else if (px[i] > px[i + 1]) {
      for (int x = px[i]; x > px[i + 1]; x--)
        h[x + MaxXL] +=
            py[i] + floor((long long)(py[i + 1] - py[i]) * (x - px[i]),
                          px[i + 1] - px[i]);
      if (px[i + 1] <= px[(i + 2) % n]) h[px[i + 1] + MaxXL] += py[i + 1];
    }
  }
  long long cnt = 0;
  double sum1 = 0;
  double sum2 = 0;
  for (int x = -MaxXL; x <= MaxXL; x++) {
    cnt += h[x + MaxXL];
    sum1 += (double)x * h[x + MaxXL];
    sum2 += (double)x * x * h[x + MaxXL];
  }
  sum1 /= cnt;
  sum2 /= cnt;
  return (sum2 - sum1 * sum1) * cnt / (cnt - 1);
}
int main() {
  int n;
  static int px[MaxN + 1], py[MaxN + 1];
  cin >> n;
  for (int i = 0; i < n; i++) scanf("%d %d", &px[i], &py[i]);
  px[n] = px[0], py[n] = py[0];
  double res = 0;
  res += calc(n, px, py);
  res += calc(n, py, px);
  printf("%.8f\n", res);
  return 0;
}