#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
pair<int, int> a[N];
double p2[N];
long long xmult(pair<int, int> a, pair<int, int> b, pair<int, int> c) {
  return 1LL * (b.first - a.first) * (c.second - a.second) -
         1LL * (c.first - a.first) * (b.second - a.second);
}
double pick(double area, double edge) { return area - edge / 2 + 1; }
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
double get_p(int n, int m) {
  if (n >= 200) return 1.0 / p2[m];
  return (p2[n - m] - 1) / (p2[n] - 1 - n - 0.5 * n * (n - 1));
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d%d", &a[i].first, &a[i].second);
  a[n] = a[0];
  double area = 0, edge = n;
  for (int i = 0; i < n; i++) {
    area += fabs(xmult(a[0], a[i], a[i + 1])) * 0.5;
    edge += gcd(abs(a[i + 1].first - a[i].first),
                abs(a[i + 1].second - a[i].second)) -
            1;
  }
  p2[0] = 1;
  for (int i = 1; i < 200; i++) p2[i] = p2[i - 1] * 2;
  double sum = 0;
  for (int i = 0; i < n; i++) {
    double t_area = 0, t_edge = gcd(abs(a[i + 1].first - a[i].first),
                                    abs(a[i + 1].second - a[i].second)) -
                                1;
    for (int j = (i + 2) % n, m = 3; m <= 60 && (j + 1) % n != i;
         j = (j + 1) % n, m++) {
      int p = (j - 1) % n;
      if (p < 0) p += n;
      t_area += fabs(xmult(a[i], a[p], a[j])) * 0.5;
      t_edge +=
          gcd(abs(a[p].first - a[j].first), abs(a[p].second - a[j].second)) - 1;
      int t =
          gcd(abs(a[i].first - a[j].first), abs(a[i].second - a[j].second)) - 1;
      double tot = pick(t_area, t_edge + t + m);
      tot += t;
      sum += get_p(n, m) * tot;
    }
  }
  printf("%.20lf\n", pick(area, edge) - sum);
  return 0;
}
