#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, const U &b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, const U &b) {
  if (a < b) a = b;
}
using DO = double;
using LL = long long;
using pii = pair<int, int>;
const int N = 2525;
pii p[N];
struct line {
  int first, second, st, ed;
  line(int first = 0, int second = 0, int st = 0, int ed = 0)
      : first(first), second(second), st(st), ed(ed) {}
  bool operator<(const line &L) const {
    return (LL)second * L.first > (LL)L.second * first;
  }
} L[N * N];
int I[N], rI[N];
LL S;
int n;
inline LL c3(int n) {
  if (n < 3) return 0;
  return (LL)n * (n - 1) * (n - 2) / 6;
}
inline LL get(int i) {
  int st = rI[L[i].st], ed = rI[L[i].ed];
  if (st > ed) swap(st, ed);
  return c3(st) + c3(n - 1 - ed);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    I[i] = i;
    scanf("%d%d", &p[i].first, &p[i].second);
  }
  sort(I, I + n, [](const int &a, const int &b) {
    return (p[a].first != p[b].first) ? (p[a].first < p[b].first)
                                      : (p[a].second < p[b].second);
  });
  int N = 0;
  for (int i = 0; i < n; i++) {
    rI[I[i]] = i;
    for (int j = i + 1; j < n; j++) {
      L[N].first = p[j].first - p[i].first;
      L[N].second = p[j].second - p[i].second;
      L[N].st = i;
      L[N].ed = j;
      if (L[N].first < 0 || (!L[N].first && L[N].second < 0)) {
        L[N].first = -L[N].first;
        L[N].second = -L[N].second;
        swap(L[N].st, L[N].ed);
      }
      N++;
    }
  }
  sort(L, L + N);
  LL ans = (LL)n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / 24;
  for (int i = 0; i < N; i++) {
    ans -= get(i);
    swap(rI[L[i].st], rI[L[i].ed]);
    I[rI[L[i].st]] = L[i].st;
    I[rI[L[i].ed]] = L[i].ed;
  }
  cout << ans << endl;
  return 0;
}
