#include <bits/stdc++.h>
using namespace std;
const long long maxn = 6e3 + 5;
inline long long read() {
  char c = getchar();
  long long t = 0, f = 1;
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    t = (t << 3) + (t << 1) + (c ^ 48);
    c = getchar();
  }
  return t * f;
}
long long n, cnt;
struct node {
  long long x, y;
  long double at;
} a[maxn], b[maxn];
inline long long cross(node a, node b) { return a.x * b.y - a.y * b.x; }
bool cmp(node a, node b) {
  long double p = a.at, q = b.at;
  if (p != q) {
    return p < q;
  }
  return a.x < b.x;
}
signed main() {
  n = read();
  for (long long i = 1; i <= n; i++) {
    a[i].x = read(), a[i].y = read();
  }
  long long ans = 0;
  for (long long i = 1; i <= n; i++) {
    cnt = 0;
    for (long long j = 1; j <= n; j++) {
      if (i != j) {
        b[++cnt].x = a[j].x - a[i].x;
        b[cnt].y = a[j].y - a[i].y;
        b[cnt].at = atan2(b[cnt].y, b[cnt].x);
      }
    }
    sort(b + 1, b + 1 + cnt, cmp);
    for (long long i = cnt + 1; i <= cnt * 2; i++) b[i] = b[i - cnt];
    long long tmp = (n - 1) * (n - 2) * (n - 3) * (n - 4) / 24;
    for (long long l = 1, r = 0; l < n; l++) {
      for (r = max(r, l + 1); r < l + n && (cross(b[l], b[r]) > 0); r++)
        ;
      r--;
      if (r - l - 2 > 0) tmp -= (r - l) * (r - l - 1) * (r - l - 2) / 6;
    }
    ans += tmp;
  }
  printf("%lld\n", ans);
  return 0;
}
