#include <bits/stdc++.h>   using namespace std;   const int MAXN = 2005;   struct Point {     long long x, y;     Point() {}     Point(long long x, long long y) : x(x), y(y) {}     bool operator<(const Point& rhs) const {       if (y != rhs.y)         return y < rhs.y;       else         return x < rhs.x;     }   };   Point operator-(Point a, Point b) { return Point(a.x - b.x, a.y - b.y); }   Point operator*(Point v, long long mul) { return Point(v.x * mul, v.y * mul); }   long long cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }   int n;   Point p[MAXN];   inline long long C(long long x) { return x * (x - 1) / 2; }   long long calc(Point o, vector<pair<Point, int> >& v) {     sort(v.begin(), v.end(),          [&o](const pair<Point, int>& a, const pair<Point, int>& b) -> bool {            return cross(a.first - o, b.first - o) < 0;          });     long long cnt[2] = {0}, ret = 0;     for (auto& i : v) cnt[i.second]++;     for (auto& i : v) {       cnt[i.second]--;       ret += C(cnt[0]) * C(cnt[1]);       cnt[i.second ^ 1]++;     }     return ret;   }   int main() {     scanf( %d , &n);     for (int i = 0; i < n; i++) scanf( %lld%lld , &p[i].x, &p[i].y);     long long ans = 0;     for (int i = 0; i < n; i++) {       vector<pair<Point, int> > v;       for (int j = 0; j < n; j++)         if (j != i) {           if (p[i] < p[j])             v.emplace_back(p[j], 1);           else             v.emplace_back(p[i] * 2 - p[j], 0);         }       ans += calc(p[i], v);     }     ans /= 2;     printf( %lld n , ans);     return 0;   }   