#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
typedef class Point {
 public:
  double x, y;
  Point(double x = 0.0, double y = 0.0) : x(x), y(y) {}
} Point, Vector;
Point operator-(Point a, Point b) { return Point(a.x - b.x, a.y - b.y); }
double cross(Vector u, Vector v) { return u.x * v.y - u.y * v.x; }
int n;
Point *ps;
inline void init() {
  scanf("%d", &n);
  ps = new Point[(n + 1)];
  for (int i = 1; i <= n; i++) scanf("%lf%lf", &ps[i].x, &ps[i].y);
}
int cnt = 0;
long long res = 0;
pair<double, int> *ar;
bool *vis;
int getNext(int p) {
  if (p == cnt) return 1;
  return p + 1;
}
inline void solve() {
  vis = new bool[(n + 1)];
  ar = new pair<double, int>[(n + 1)];
  for (int i = 1; i <= n; i++) {
    cnt = 0;
    for (int j = 1; j <= n; j++)
      if (j ^ i) {
        Vector dif = ps[j] - ps[i];
        ar[++cnt] = make_pair(atan2(dif.y, dif.x), j);
      }
    sort(ar + 1, ar + cnt + 1);
    int p = 1, cntl = 0;
    memset(vis, false, sizeof(bool) * (n + 1));
    for (int j = 1; j < n; j++) {
      Vector dif = ps[ar[j].second] - ps[i];
      for (int np = getNext(p);
           np != j && cross(dif, ps[ar[np].second] - ps[i]) > 0;
           p = np, np = getNext(np))
        cntl += !vis[np], vis[np] = true;
      res = res + cntl * 1ll * (cntl - 1) / 2 * (n - cntl - 2) * 1ll *
                      (n - cntl - 3) / 2;
      int np = ar[getNext(j)].second, nj = getNext(j);
      if (cross(dif, ps[np] - ps[i]) > 0)
        cntl--, vis[nj] = false;
      else {
        if (p == j) p = getNext(j);
      }
    }
  }
  cout << (res >> 1) << endl;
}
int main() {
  init();
  solve();
  return 0;
}
