#include <bits/stdc++.h>
inline int getint() {
  int r = 0, s = 0;
  char c = getchar();
  for (; !isdigit(c); c = getchar()) s |= c == '-';
  for (; isdigit(c); c = getchar()) r = (((r << 2) + r) << 1) + (c ^ '0');
  return s ? -r : r;
}
const int N = 2020;
struct point {
  int x, y;
  inline void print() { printf("(%d %d)\n", x, y); }
} po[N];
int n;
std::vector<point> cur;
int nowp;
inline bool cmp(const point &a, const point &b) {
  int ax = a.x - po[nowp].x;
  int ay = a.y - po[nowp].y;
  int bx = b.x - po[nowp].x;
  int by = b.y - po[nowp].y;
  if (ay < 0) ay = -ay, ax = -ax;
  if (by < 0) by = -by, bx = -bx;
  return 1LL * ax * by - 1LL * ay * bx > 0;
}
inline int cross(const point &a, const point &b, const point &c) {
  int x1 = b.x - a.x;
  int y1 = b.y - a.y;
  int x2 = c.x - a.x;
  int y2 = c.y - a.y;
  return 1LL * x1 * y2 - 1LL * x2 * y1 > 0;
}
inline int side(const point &a, const point &b) {
  return a.y == b.y ? b.x > a.x : b.y > a.y;
}
inline long long C2(int x) { return 1LL * x * (x - 1) / 2; }
int main() {
  n = getint();
  for (int i = 1; i <= n; i++) po[i].x = getint(), po[i].y = getint();
  long long ans = 0, tmp = 0;
  for (nowp = 1; nowp <= n; nowp++) {
    tmp = 0;
    cur.clear();
    for (int j = 1; j <= n; j++)
      if (nowp != j) cur.push_back(po[j]);
    std::sort(cur.begin(), cur.end(), cmp);
    int k1 = 0, k2 = 0;
    for (int j = 1, sz = cur.size(); j < sz; j++) {
      if (cross(po[nowp], cur[0], cur[j]))
        k1++;
      else
        k2++;
    }
    tmp += C2(k1) * C2(k2);
    for (int j = 1, sz = cur.size(); j < sz; j++) {
      int ns = cross(po[nowp], cur[0], cur[j]);
      int ps = cross(po[nowp], cur[0], cur[j - 1]);
      if (ps || j == 1)
        k2++;
      else
        k1++;
      if (ns)
        k1--;
      else
        k2--;
      tmp += C2(k1) * C2(k2);
    }
    ans += tmp;
  }
  printf("%lld\n", ans / 2);
  return 0;
}
