#include <bits/stdc++.h>
using namespace std;
const int BIG = 2020;
const double inf = 1e30;
int N;
struct Point {
  int x, y;
  bool operator<(const Point& other) const {
    if (x == other.x)
      return y < other.y;
    else
      return x < other.x;
  }
} points[BIG];
struct Seg {
  Point a, b;
  Seg() {}
  Seg(const Point& _a, const Point& _b) {
    if (_a < _b) {
      a = _a;
      b = _b;
    } else {
      a = _b;
      b = _a;
    }
  }
  double slope() const {
    if (a.x == b.x)
      return inf;
    else
      return (b.y - a.y) / (double)(b.x - a.x);
  }
  long long cross(const Point& p) const {
    int x1 = p.x - a.x;
    int y1 = p.y - a.y;
    int x2 = b.x - a.x;
    int y2 = b.y - a.y;
    return -(x1 * (long long)y2 - x2 * (long long)y1);
  }
  bool operator<(const Seg& other) const { return slope() < other.slope(); }
} segs[BIG * BIG];
int segN = 0;
long long choose2(int n) { return n * (n - 1) / 2; }
int main() {
  scanf("%d", &N);
  for (int i = 0; i < N; ++i) {
    scanf("%d %d", &points[i].x, &points[i].y);
    for (int j = 0; j < i; ++j) {
      segs[segN++] = Seg(points[i], points[j]);
    }
  }
  sort(points, points + N);
  sort(segs, segs + segN);
  long long answer = 0;
  for (int i = 0; i < segN; ++i) {
    ;
    int low = 0, high = N - 1;
    while (low < high) {
      int mid = (low + high) / 2;
      long long val = segs[i].cross(points[mid]);
      if (val > 0) {
        high = mid - 1;
      } else if (val < 0) {
        low = mid + 1;
      } else {
        high = mid;
      }
    }
    assert(low + 1 < N);
    assert(segs[i].cross(points[low]) == 0);
    assert(segs[i].cross(points[low + 1]) == 0);
    int nbelow = low;
    int nabove = N - (low + 2);
    ;
    ;
    answer += choose2(nabove) * choose2(nbelow);
    swap(points[low], points[low + 1]);
  }
  cout << answer << endl;
  return 0;
}
