#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  int index;
  point(int _x = 0, int _y = 0) : x(_x), y(_y) { index = -1; }
  point &operator+=(const point &other) {
    x += other.x;
    y += other.y;
    return *this;
  }
  point &operator-=(const point &other) {
    x -= other.x;
    y -= other.y;
    return *this;
  }
  point operator+(const point &other) const { return point(*this) += other; }
  point operator-(const point &other) const { return point(*this) -= other; }
  bool operator<(const point &other) const {
    return make_pair(y, x) > make_pair(other.y, other.x);
  }
};
long long cp(const point &a, const point &b) {
  return (long long)a.x * b.y - (long long)b.x * a.y;
}
long long ccw(const point &a, const point &b, const point &c) {
  return cp(b - a, c - a);
}
struct segment {
  point p;
  int index1, index2;
  double ang;
  segment(const point &_p, int _index1 = -1, int _index2 = -1)
      : p(_p), index1(_index1), index2(_index2) {
    ang = atan2(p.y, p.x);
  }
  bool operator<(const segment &other) const { return ang < other.ang; }
};
const int N = 2000 + 5;
int n;
point a[N];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d %d", &a[i].x, &a[i].y);
  }
  auto choose = [&](long long x) { return x * (x - 1) / 2; };
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    vector<segment> v;
    for (int j = 1; j <= n; j++) {
      if (i != j) v.push_back(segment(a[j] - a[i]));
    }
    sort(v.begin(), v.end());
    int sz = v.size();
    for (int i = 0; i < sz; i++) v.push_back(v[i]);
    int j = 0;
    for (int i = 0; i < sz; i++) {
      while (j + 1 < v.size() and (j <= i or cp(v[i].p, v[j + 1].p) > 0)) j++;
      ans += choose(j - i) * choose(n - 2 - j + i);
    }
  }
  printf("%lld\n", ans / 2);
  return 0;
}
