#include <bits/stdc++.h>
using namespace std;
int gcd(int A, int B) {
  if (B) return gcd(B, A % B);
  return A;
}
double operating(long long x1, long long y1, long long x2, long long y2) {
  return (x1 * y2) - (x2 * y1);
}
int main(int argc, const char* argv[]) {
  double polygons[(int)1e5 + 10];
  double p[(int)1e5 + 10];
  int x[(int)1e5 + 10];
  int y[(int)1e5 + 10];
  double s = 0.0;
  double result;
  double tmp = 0.0;
  double mult;
  int n;
  int minimum;
  cin >> n;
  minimum = min(n, 60);
  p[0] = 1;
  for (int i = 0; i < n; ++i) {
    cin >> x[i] >> y[i];
    p[i + 1] = p[i] * 0.5;
  }
  for (int i = 3; i < minimum; ++i) {
    mult = (p[i] - p[n]) / (1 - p[n] * ((long long)n * (n - 1) / 2 + n + 1));
    for (int j = 0; j < n; ++j) {
      polygons[j] +=
          operating(x[(j + i - 2) % n] - x[j], y[(j + i - 2) % n] - y[j],
                    x[(j + i - 1) % n] - x[j], y[(j + i - 1) % n] - y[j]);
      s -= mult * polygons[j];
    }
  }
  for (int i = 0; i < n - 2; ++i) {
    s += operating(x[i + 1] - x[0], y[i + 1] - y[0], x[i + 2] - x[0],
                   y[i + 2] - y[0]);
  }
  s /= 2;
  for (int i = 2; i <= minimum; ++i) {
    mult = (p[i] - p[n]) / (1 - p[n] * ((long long)n * (n - 1) / 2 + n + 1));
    for (int j = 0; j < n; ++j) {
      tmp += mult * gcd(abs(x[(j + i - 1) % n] - x[j]),
                        abs(y[(j + i - 1) % n] - y[j]));
    }
  }
  result = s - tmp / 2 + 1;
  printf("%10f", result);
  cout << endl;
  return 0;
}
