func_code_string: #include <bits/stdc++.h>   const int oo = 0x3f3f3f3f;   template <typename T>   inline bool chkmax(T &a, T b) {     return a < b ? a = b, true : false;   }   template <typename T>   inline bool chkmin(T &a, T b) {     return a > b ? a = b, true : false;   }   template <typename T>   T read(T &first) {     int f = 1;     char ch = getchar();     for (; !isdigit(ch); ch = getchar())       if (ch ==  - ) f = -1;     for (first = 0; isdigit(ch); ch = getchar()) first = 10 * first + ch -  0 ;     return first *= f;   }   template <typename T>   void write(T first) {     if (first == 0) {       putchar( 0 );       return;     }     if (first < 0) {       putchar( - );       first = -first;     }     static char s[20];     int top = 0;     for (; first; first /= 10) s[++top] = first % 10 +  0 ;     while (top) putchar(s[top--]);   }   const int MAXN = 2e5 + 5;   const int CNT = 60;   int N;   std::pair<int, int> A[MAXN];   int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }   inline int count(int i, int j) {     return gcd(std::abs(A[j].first - A[i].first),                std::abs(A[j].second - A[i].second));   }   inline long long cross(const std::pair<int, int> &a,                          const std::pair<int, int> &b) {     return (long long)a.first * b.second - (long long)a.second * b.first;   }   void input() {     read(N);     for (int i = 0; i < N; ++i) {       read(A[i].first);       read(A[i].second);     }   }   void solve() {     memcpy(A + N, A, sizeof(*A) * N);     long long a = 0, b = 0;     for (int i = 0; i < N; ++i) {       a += cross(A[i], A[i + 1]);       b += count(i, i + 1);     }     long double coef[MAXN];     long double tnn = pow((long double)2, -N);     for (int i = 2; i <= CNT && i < N - 1; ++i) {       coef[i] = pow((long double)2, -i - 1) - tnn;     }     long double ans = 0.5 * a - 0.5 * b + 1;     long double contrib = 0;     for (int i = 0; i < N; ++i) {       a = cross(A[i], A[i + 1]);       b = count(i, i + 1);       for (int k = 2; k <= CNT && k < N - 1; ++k) {         int j = i + k;         a += cross(A[j - 1], A[j]);         b += count(j - 1, j);         long long a0 = cross(A[j], A[i]);         long long b0 = count(j, i);         contrib += (0.5 * (a + a0) - 0.5 * (b + b0) + b0) * coef[k];       }     }     ans -= contrib / (1 - tnn - N * tnn - (long long)N * (N - 1) / 2 * tnn);     printf( %.15f n , (double)ans);   }   int main() {     input();     solve();     return 0;   }   