#include <bits/stdc++.h>
using namespace std;
const int N = 100005, inf = 0x3f3f3f3f;
int read() {
  int f = 1, g = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) g = g * 10 + ch - '0';
  return f * g;
}
int gcd(int x, int y) {
  x = abs(x);
  y = abs(y);
  if (!y) return x;
  int r = x % y;
  while (r) {
    x = y;
    y = r;
    r = x % y;
  }
  return y;
}
struct vec {
  int x, y;
  void rd() {
    x = read();
    y = read();
  }
  int count() { return gcd(x, y); }
} a[N];
vec operator+(vec x, vec y) { return (vec){x.x + y.x, x.y + y.y}; }
vec operator-(vec x, vec y) { return (vec){x.x - y.x, x.y - y.y}; }
double operator^(vec x, vec y) { return 1.0 * x.x * y.y - 1.0 * x.y * y.x; }
int n;
double po2[N], inv2[N], ans, cnt;
signed main() {
  n = read();
  for (int i = 1; i <= n; i++) a[i].rd();
  po2[0] = 1;
  for (int i = 1; i <= n; i++) po2[i] = po2[i - 1] * 2;
  ans = cnt = po2[n] - 1.0 * n * (n - 1) / 2 - n - 1;
  if (n <= 1000) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        if (i != j) {
          int x = (i + n - j - 1) % n;
          ans += (po2[x] - 1) * ((a[i] ^ a[j]) - (a[i] - a[j]).count()) / 2;
        }
  } else {
    ans = 1;
    inv2[0] = 1;
    for (int i = 1; i <= n; i++) inv2[i] = inv2[i - 1] / 2;
    for (int i = 1; i <= n; i++)
      for (int j = i; j < i + 100; j++) {
        int x = (i + n - (j + 1) - 1) % n;
        ans += inv2[n - x] *
               ((a[i] ^ a[j % n + 1]) - (a[i] - a[j % n + 1]).count()) / 2;
      }
    printf("%.12lf\n", ans);
    return 0;
  }
  ans /= cnt;
  printf("%.12lf\n", ans);
  return 0;
}
