#include <bits/stdc++.h>
using namespace std;
const int max_n = 2555, inf = 1000111222;
struct point {
  int x, y;
  point() {}
  point(int x, int y) : x(x), y(y) {}
  point operator-(const point &p) const { return {x - p.x, y - p.y}; }
};
long long vect_pr(const point &a, const point &b) {
  return 1LL * a.x * b.y - 1LL * a.y * b.x;
}
point O;
int get_z(int x) {
  if (x == 0) {
    return 0;
  } else if (x > 0) {
    return 1;
  }
  return -1;
}
bool cmp(const point &a, const point &b) {
  if (get_z(a.y) * get_z(b.y) < 0) {
    return get_z(a.y) >= 0;
  }
  if (get_z(a.y) * get_z(b.y) == 0) {
    if (std::min(get_z(a.y), get_z(b.y)) == -1) {
      return get_z(a.y) == 0;
    }
  }
  return vect_pr(a, b) > 0;
}
int n, add[max_n], sum[max_n];
point p[max_n];
vector<point> v;
long long c2(long long cnt) {
  if (cnt < 2) {
    return 0;
  }
  return (cnt * (cnt - 1)) / 2;
}
long long c3(long long n) {
  if (n < 3) {
    return 0;
  }
  return n * (n - 1) * (n - 2) / 6;
}
long long c4(long long n) { return n * (n - 1) * (n - 2) * (n - 3) / 24; }
long long solve() {
  sort(v.begin(), v.end(), cmp);
  long long res = 0;
  int pos = 0;
  int csz = v.size();
  for (int i = 0; i < csz; ++i) {
    v.push_back(v[i]);
  }
  for (int i = 0; i < csz; ++i) {
    while (pos < i + csz && vect_pr(v[i], v[pos]) >= 0) {
      ++pos;
    }
    res += c3(pos - i - 1);
  }
  return res;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; ++i) {
    cin >> p[i].x >> p[i].y;
  }
  long long ans = 1LL * n * c4(n - 1);
  for (int i = 0; i < n; ++i) {
    v.clear();
    for (int j = 0; j < n; ++j) {
      if (j != i) {
        v.push_back(p[j] - p[i]);
      }
    }
    ans -= solve();
  }
  cout << ans << "\n";
  return 0;
}
