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;
int x[100010], y[100010], n;
int CEIL(long long a, long long b) {
  if (b < 0) a = -a, b = -b;
  if (a < 0) return -((-a) / b);
  return a / b + (a % b != 0);
}
int FLOOR(long long a, long long b) {
  if (b < 0) a = -a, b = -b;
  if (a > 0) return a / b;
  a = -a;
  int ans = a / b;
  if (a % b) ans++;
  return -ans;
}
int CEIL(int p1, int p2, int Y) {
  if (y[p1] == y[p2]) return min(x[p1], x[p2]);
  return x[p1] + CEIL(1LL * (Y - y[p1]) * (x[p2] - x[p1]), y[p2] - y[p1]);
}
int FLOOR(int p1, int p2, int Y) {
  if (y[p1] == y[p2]) return max(x[p1], x[p2]);
  return x[p1] + FLOOR(1LL * (Y - y[p1]) * (x[p2] - x[p1]), y[p2] - y[p1]);
}
int num[2000010];
double cal() {
  long long s = 0;
  for (int i = 0; i < n; i++)
    s += 1LL * x[i] * y[(i + 1) % n] - 1LL * y[i] * x[(i + 1) % n];
  if (s < 0) reverse(x, x + n), reverse(y, y + n);
  int p1 = 0, p2 = 0;
  for (int i = 1; i < n; i++)
    if (y[i] > y[p1]) p1 = i, p2 = i;
  int mi = (int)1e8;
  for (int i = 0; i < n; i++) mi = min(mi, y[i]);
  memset(num, 0, sizeof(num));
  for (int i = y[p1]; i >= mi; i--) {
    int L = CEIL(p1, (p1 + 1) % n, i);
    int R = FLOOR(p2, (p2 - 1 + n) % n, i);
    num[i] = R - L + 1;
    if (num[i] < 0) puts("fuck");
    if (i == y[(p1 + 1) % n]) p1 = (p1 + 1) % n;
    if (i == y[(p2 - 1 + n) % n]) p2 = (p2 - 1 + n) % n;
  }
  long long cnt = 0;
  for (int i = 0; i < 2000000; i++) cnt += num[i];
  s = 0;
  for (int i = 0; i < 2000000; i++) s += 1LL * i * num[i];
  double ans = 0;
  for (int i = 0; i < 2000000; i++)
    if (num[i]) ans += 1.0 * i * num[i] / (cnt - 1) * (i - 1.0 * s / cnt);
  return ans;
}
int main() {
  while (~scanf("%d", &n)) {
    for (int i = 0; i < n; i++) scanf("%d %d", &x[i], &y[i]);
    for (int i = 0; i < n; i++) x[i] += 1000000, y[i] += 1000000;
    double ans = cal();
    for (int i = 0; i < n; i++) swap(x[i], y[i]);
    ans += cal();
    printf("%.10f\n", ans);
  }
}