#include <bits/stdc++.h>
using namespace std;
int n;
double Ans, area[100100], b[100100];
struct Point {
  double x, y;
  Point() {}
  Point(double _, double __) : x(_), y(__) {}
  void read() { scanf("%lf%lf", &x, &y); }
} p[100100];
Point operator-(Point A, Point B) { return Point(A.x - B.x, A.y - B.y); }
double Cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
long long Gcd(long long a, long long b) { return b ? Gcd(b, a % b) : a; }
int main() {
  scanf("%d", &n);
  for (int i = 0; i <= n - 1; i++) p[i].read();
  b[0] = 1.;
  for (int i = 1; i <= n; i++) b[i] = b[i - 1] / 2.;
  for (int i = 1; i <= n - 2; i++)
    Ans += Cross(p[i] - p[0], p[i + 1] - p[0]) / 2.;
  int lim = min(100, n);
  for (int nd = 3; nd <= lim - 1; nd++) {
    double prob =
        (b[nd] - b[n]) / (1 - b[n] * ((double)n * (n - 1) / 2. + n + 1));
    for (int st = 0; st <= n - 1; st++) {
      area[st] +=
          Cross(p[(st + nd - 2) % n] - p[st], p[(st + nd - 1) % n] - p[st]) /
          2.;
      Ans -= prob * area[st];
      Ans -= prob *
             (double)Gcd(fabs(p[(st + nd - 1) % n].x - p[st].x),
                         fabs(p[(st + nd - 1) % n].y - p[st].y)) /
             2.;
    }
  }
  double prob = (b[2] - b[n]) / (1 - b[n] * ((double)n * (n - 1) / 2. + n + 1));
  for (int i = 0; i <= n - 1; i++)
    Ans -= prob *
           (double)Gcd(fabs(p[(i + 1) % n].x - p[i].x),
                       fabs(p[(i + 1) % n].y - p[i].y)) /
           2.;
  printf("%.10lf\n", Ans + 1.);
}
