#include <bits/stdc++.h>
using namespace std;
const long long N = 2005;
long long n, ans;
struct Point {
  long long x, y;
  Point(long long x = 0, long long y = 0) : x(x), y(y) {}
  bool operator==(const Point& rhs) const { return x == rhs.x && y == rhs.y; }
} p[N];
vector<Point> vec;
long long CCW(Point a, Point b) { return a.x * b.y - a.y * b.x; }
bool inupper(Point a) { return a.y > 0 || (a.y == 0 && a.x > 0); }
bool cmp(Point a, Point b) {
  if (inupper(a) != inupper(b)) return inupper(a) > inupper(b);
  return CCW(a, b) > 0;
}
signed main() {
  cin >> n;
  for (long long i = 1; i <= n; ++i) cin >> p[i].x >> p[i].y;
  for (long long root = 1; root <= n; ++root) {
    vec.clear();
    for (long long i = 1; i <= n; ++i)
      if (i != root) {
        vec.push_back(Point(p[i].x - p[root].x, p[i].y - p[root].y));
      }
    sort(vec.begin(), vec.end(), cmp);
    long long pter = 1;
    for (long long i = 0; i < vec.size(); ++i) {
      bool ok = 0;
      while (1) {
        if (CCW(vec[i], vec[(i + vec.size() - 1) % vec.size()]) > 0) {
          ok = 1;
          break;
        }
        if (CCW(vec[i], vec[pter]) < 0) break;
        pter = (pter + 1) % vec.size();
      }
      long long num1, num2;
      if (ok)
        num1 = 0;
      else {
        if (pter < i)
          num1 = i - pter;
        else
          num1 = vec.size() - pter + i;
      }
      num2 = vec.size() - 1 - num1;
      ans += num1 * (num1 - 1) / 2 * num2 * (num2 - 1) / 2;
    }
  }
  ans >>= 1;
  cout << ans;
  return 0;
}
