#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct point {
  ll x, y;
  point() : x(0), y(0) {}
  point(ll a, ll b) : x(a), y(b) {}
};
ll operator*(point a, point b) { return a.x * b.y - b.x * a.y; }
point operator-(point a, point b) { return point(a.x - b.x, a.y - b.y); }
point operator-(point a) { return point(-a.x, -a.y); }
int ret[][2] = {{0, 3}, {1, 2}};
inline int quad(point p) { return ret[p.x >= 0][p.y >= 0]; }
inline bool cmp(const point& a, const point& b) {
  return quad(a) == quad(b) ? a * b > 0 : quad(a) < quad(b);
}
const int N = 2550;
point ar[N];
int n;
ll C_3(ll n) {
  if (n < 3) return 0;
  return n * (n - 1) * (n - 2) / 6;
}
ll C_2(ll n) {
  if (n < 2) return 0;
  return n * (n - 1) / 2;
}
ll C_5(ll n) {
  if (n < 5) return 0;
  return n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / 120;
}
int getNext(int ptr, int skok) { return (ptr + skok) % (n - 1); }
int getPrev(int ptr, int skok) { return (ptr - skok + n - 1) % (n - 1); }
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  for (int i = 0; i < n; ++i) {
    cin >> ar[i].x >> ar[i].y;
  }
  ll cnt = 0;
  for (int i = 0; i < n; ++i) {
    vector<point> pcur;
    for (int j = 0; j < n; ++j) {
      if (j == i) continue;
      pcur.push_back(ar[j] - ar[i]);
    }
    sort(pcur.begin(), pcur.end(), cmp);
    int sz = n - 1;
    for (int i = 0; i < sz; ++i) {
      auto otr = -pcur[i];
      ll k[] = {otr.y - pcur[i].y, pcur[i].x - otr.x, otr * pcur[i]};
      int lo = 0, hi = sz;
      while (hi - lo > 1) {
        int m = (lo + hi) / 2;
        int id = getNext(i, m);
        if (k[0] * pcur[id].x + k[1] * pcur[id].y + k[2] > 0) {
          lo = m;
        } else {
          hi = m;
        }
      }
      cnt += C_3(lo);
      cnt += C_3(sz - lo - 1);
    }
  }
  cout << 5 * C_5(n) - cnt / 2;
  return 0;
}
