#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
double pi = acos(0) * 2;
template <class ctype, class dtype>
struct POINT {
  ctype x, y;
  POINT() : x(0), y(0) {}
  POINT(ctype _x, ctype _y) : x(_x), y(_y) {}
  POINT<ctype, dtype> operator+(const POINT<ctype, dtype>& rhs) const {
    return POINT<ctype, dtype>(x + rhs.x, y + rhs.y);
  }
  POINT<ctype, dtype> operator-(const POINT<ctype, dtype>& rhs) const {
    return POINT<ctype, dtype>(x - rhs.x, y - rhs.y);
  }
  POINT<ctype, dtype> operator*(ctype c) const {
    return POINT<ctype, dtype>(x * c, y * c);
  }
  POINT<ctype, dtype> operator/(ctype c) const {
    return POINT<ctype, dtype>(x / c, y / c);
  }
  POINT<ctype, dtype>& operator+=(const POINT<ctype, dtype>& rhs) {
    x += rhs.x, y += rhs.y;
    return *this;
  }
  POINT<ctype, dtype>& operator-=(const POINT<ctype, dtype>& rhs) {
    x -= rhs.x, y -= rhs.y;
    return *this;
  }
  POINT<ctype, dtype>& operator*=(ctype c) {
    x *= c;
    y *= c;
    return *this;
  }
  POINT<ctype, dtype>& operator/=(ctype c) {
    x /= c;
    y /= c;
    return *this;
  }
  ctype dot(const POINT<ctype, dtype>& rhs) const {
    return x * rhs.x + y * rhs.y;
  }
  ctype cross(const POINT<ctype, dtype>& rhs) const {
    return x * rhs.y - y * rhs.x;
  }
  dtype norm() const { return sqrt(dtype(dot(*this))); }
  dtype cos_angle(const POINT<ctype, dtype>& rhs) const {
    return dot(rhs) / (norm() * rhs.norm());
  }
  dtype angle(const POINT<ctype, dtype>& rhs) const {
    auto crs = cross(rhs);
    if (crs > 0) return acos(cos_angle(rhs));
    if (crs < 0) return 2 * pi - acos(cos_angle(rhs));
    auto dt = dot(rhs);
    return dt > 0 ? 0 : pi;
  }
};
const int MAXN = 5e3 + 10;
POINT<long long, long double> a[MAXN], b[MAXN];
double ag[MAXN];
long long comb(int n, int k) {
  if (n < k) return 0;
  long long res = 1;
  for (auto i = (1); i < (k + 1); i++) {
    res = res * (n - i + 1) / i;
  }
  return res;
}
int main(int argc, char* argv[]) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  ;
  cin >> n;
  for (auto i = (0); i < (n); i++) {
    cin >> a[i].x >> a[i].y;
  }
  long long res = 0;
  for (auto i = (0); i < (n); i++) {
    int tot = 0;
    for (auto j = (0); j < (n); j++) {
      if (j == i) continue;
      b[tot++] = a[j];
    };
    ;
    sort(b, b + tot,
         [&](const POINT<long long, long double>& x,
             const POINT<long long, long double>& y) {
           POINT<long long, long double> px = x - a[i];
           POINT<long long, long double> py = y - a[i];
           long long cx = POINT<long long, long double>(1, 0).cross(px);
           long long cy = POINT<long long, long double>(1, 0).cross(py);
           cx = cx > 0 || (cx == 0 && px.x > 0);
           cy = cy > 0 || (cy == 0 && py.x > 0);
           if (cx < cy)
             return true;
           else if (cx > cy)
             return false;
           return px.cross(py) > 0;
           ;
         });
    ;
    ;
    for (auto j = (0); j < (tot); j++) b[j + tot] = b[j];
    ;
    ;
    int k = 0;
    long long tmp = 0;
    for (auto j = (0); j < (tot); j++) {
      while (k < j + tot && (b[j] - a[i]).cross(b[k] - a[i]) >= 0) k++;
      ;
      ;
      tmp += comb(k - j - 1, 3);
    }
    res += comb(n - 1, 4) - tmp;
    ;
    ;
  }
  cout << res << '\n';
  return 0;
}
