#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f, maxn = 100001;
struct node {
  int x, y;
  node operator-(const node &b) { return (node){x - b.x, y - b.y}; }
  double operator*(const node &b) { return 1.0 * x * b.y - 1.0 * y * b.x; }
} a[maxn];
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
double pick(double S, double T) { return S + 1.0 - 0.5 * T; }
double f[105];
double Get(int n, int k) {
  if (n > 100) return 1.0 / f[k + 1];
  return (f[n - k - 1] - 1) / (f[n] - 1 - n - 0.5 * n * (n - 1));
}
int main() {
  f[0] = 1;
  for (int i = 1; i <= 100; i++) f[i] = 2.0 * f[i - 1];
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d%d", &a[i].x, &a[i].y);
  double S = 0, T = 0;
  for (int i = 0; i < n; i++) {
    int j = (i + 1) % n;
    S += (a[i] - a[0]) * (a[j] - a[0]) * 0.5;
    T += gcd(abs(a[j].x - a[i].x), abs(a[j].y - a[i].y));
  }
  double ans = 0;
  for (int i = 0; i < n; i++) {
    node pre = a[(i + 1) % n] - a[i];
    double s = 0, t = gcd(abs(pre.x), abs(pre.y));
    for (int j = (i + 2) % n, k = 2; k <= 35 && (j + 1) % n != i;
         j = (j + 1) % n, k++) {
      node now = a[j] - a[i];
      node temp = now - pre;
      double num = gcd(abs(now.x), abs(now.y));
      t += num + gcd(abs(temp.x), abs(temp.y));
      s += pre * now * 0.5;
      ans += (pick(s, t) + ((j + 1) % n == i ? 0 : num - 1)) * Get(n, k);
      t -= num;
      pre = now;
    }
  }
  printf("%.10f\n", pick(S, T) - ans);
  return 0;
}
