#include <bits/stdc++.h>
using namespace std;
struct point {
  int x;
  int y;
  point operator-(const point &p) const { return {x - p.x, y - p.y}; }
} a[2503];
int n;
struct slope {
  int q;
  int p;
  slope(int q_, int p_) {
    if (p_ < 0) {
      q_ = -q_;
      p_ = -p_;
    } else if (p_ == 0) {
      q_ = 1;
    }
    q = q_;
    p = p_;
  }
  bool operator<(const slope &sl) const {
    return 1LL * q * sl.p < 1LL * p * sl.q;
  }
  long long eval(int x, int y) { return 1LL * p * y - 1LL * q * x; }
  long long eval(const point &p) { return eval(p.x, p.y); }
};
inline long long nc2(int k) { return 1LL * k * (k - 1) / 2; }
inline long long nc3(int k) { return 1LL * k * (k - 1) * (k - 2) / 6; }
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i].x >> a[i].y;
  }
  long long cv = 0LL;
  long long c0 = 0LL;
  for (int i = 0; i < n; i++) {
    vector<pair<slope, int>> v;
    for (int j = 0; j < n; j++) {
      if (i == j) continue;
      v.push_back({slope(a[j].y - a[i].y, a[j].x - a[i].x), j});
    }
    sort(v.begin(), v.end());
    int ac = 0, bc = 0;
    ;
    ;
    for (int j = 1; j < n - 1; j++) {
      ;
      auto &sl = v[0].first;
      if (sl.eval(a[v[j].second] - a[v[0].second]) > 0)
        ac++;
      else
        bc++;
    }
    cv += 1LL * nc2(ac) * bc / 2;
    cv += 1LL * ac * nc2(bc);
    c0 += nc3(ac);
    c0 += nc3(bc);
    for (int j = 1; j < n - 1; j++) {
      auto &psl = v[j - 1].first;
      auto &sl = v[j].first;
      if (psl.eval(a[v[j].second] - a[v[j - 1].second]) > 0)
        ac--;
      else
        bc--;
      if (sl.eval(a[v[j - 1].second] - a[v[j].second]) > 0)
        ac++;
      else
        bc++;
      cv += 1LL * nc2(ac) * bc / 2;
      cv += 1LL * ac * nc2(bc);
      c0 += nc3(ac);
      c0 += nc3(bc);
    }
  }
  cv /= 2;
  c0 /= 2;
  long long nc5 = 1LL * n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / 120;
  long long y2z = 5 * nc5 - c0;
  cout << y2z << '\n';
  return 0;
}
