#include using namespace std; using P = pair; const double EPS = 1e-10; P operator-(const P& a, const P& b){ return {a.first - b.first, a.second - b.second}; } int cross(const P& a, const P& b){ return a.first * b.second - a.second * b.first; } int dot(const P& a, const P& b){ return a.first * b.first + a.second * b.second; } double atan(const P& a){ return atan2(a.second, a.first); } struct Line{ double mn = INFINITY, mx = -INFINITY; }; int main(){ int N; cin >> N; vector

A(N); for(auto& [x, y] : A) cin >> x >> y; auto cross = [&](int i, int j, int k){ return ::cross(A[j] - A[i], A[k] - A[i]); }; auto dot = [&](int i, int j, int k){ return ::dot(A[j] - A[i], A[k] - A[i]); }; auto normal = [&](int i, int j){ return ::atan(A[j] - A[i]); }; auto check = [](Line a, Line b, Line c) -> bool { if(a.mn > b.mn) swap(a, b); if(b.mn > c.mn) swap(b, c); if(a.mn > b.mn) swap(a, b); assert(c.mn - a.mn < M_PI * 2); if(max({a.mx, b.mx, c.mx}) - a.mn <= M_PI) return 0; a.mn += M_PI * 2; a.mx += M_PI * 2; if(max({a.mx, b.mx, c.mx}) - b.mn <= M_PI) return 0; b.mn += M_PI * 2; b.mx += M_PI * 2; if(max({a.mx, b.mx, c.mx}) - c.mn <= M_PI) return 0; return 1; }; map line_; for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) if(i != j){ int bit1 = 0, bit2 = 0; for(int k = 0; k < N; k++){ const int c = cross(i, j, k); if(c > 0){ bit1 ^= 1 << k; bit2 ^= 1 << k; } if(c == 0) (dot(i, j, k) > 0 ? bit1 : bit2) ^= 1 << k; } line_[bit1].mx = normal(i, j) - EPS; line_[bit2].mn = normal(i, j) + EPS; } vector line(line_.begin(), line_.end()); for(auto& [bit, l] : line){ auto& [mn, mx] = l; assert(mn != INFINITY && mx != -INFINITY); if(mn > mx) mx += M_PI * 2; assert(mn < mx); assert(mx - mn < M_PI * 2); } unordered_set ans; ans.insert(0); ans.insert((1 << N) - 1); for(auto& [bit1, l] : line) for(auto& [bit2, l] : line){ if(bit1 < bit2) break; ans.insert(bit1 & bit2); } for(auto& [bit1, l1] : line) for(auto& [bit2, l2] : line){ if(bit1 == bit2) break; for(auto& [bit3, l3] : line){ if(bit2 == bit3) break; if(check(l1, l2, l3)) ans.insert(bit1 & bit2 & bit3); } } cout << ans.size() << endl; }