#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;
}
