#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "inline")
using namespace std;
template <class T>
inline void read(T &x) {
  int ch = 0, f = 0;
  x = 0;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = 1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
  if (f) x = -x;
}
const int N = 5005;
struct P {
  long long x, y;
  friend P operator+(P a, P b) { return (P){a.x + b.x, a.y + b.y}; }
  friend P operator-(P a, P b) { return (P){a.x - b.x, a.y - b.y}; }
  friend long long operator*(P a, P b) { return a.x * b.y - b.x * a.y; }
  inline long long dis() { return x * x + y * y; }
  inline int xx() {
    if (x >= 0 && y >= 0) return 1;
    if (x <= 0 && y >= 0) return 2;
    if (x <= 0 && y <= 0) return 3;
    if (x >= 0 && y <= 0) return 4;
    return 0;
  }
} A[N], B[N], O;
int n, m;
long long ans;
inline bool cmp1(P A, P B) { return A.y != B.y ? A.y < B.y : A.x < B.x; }
inline bool cmp2(P A, P B) {
  if ((A - O).xx() != (B - O).xx()) return (A - O).xx() < (B - O).xx();
  long long res = (A - O) * (B - O);
  return res ? res > 0 : (A - O).dis() < (B - O).dis();
}
inline void solve() {
  sort(B + 1, B + m + 1, cmp2);
  for (int i = 1; i <= m; i++) B[i + m] = B[i];
  ans += 1ll * (n - 1) * (n - 2) * (n - 3) / 6;
  long long tmp = 0;
  for (int i = 1; i <= m; i++) {
    int l = i + 1, r = m + i - 1, res = -1;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if ((B[mid] - O) * (B[i] - O) < 0)
        res = mid, l = mid + 1;
      else
        r = mid - 1;
    }
    if (~res) tmp += 1ll * (res - i) * (res - i - 1) / 2;
  }
  ans -= tmp;
}
int main() {
  read(n);
  for (int i = 1; i <= n; i++) read(A[i].x), read(A[i].y);
  for (int i = 1; i <= n; i++) {
    O = A[i], m = 0;
    for (int j = 1; j <= n; j++)
      if (i != j) B[++m] = A[j];
    solve();
  }
  cout << 1ll * ans * (n - 4) / 2 << endl;
  return 0;
}
