#include <bits/stdc++.h>
using namespace std;
inline bool eq(long long a, long long b) { return a == b; }
inline bool lt(long long a, long long b) { return a < b; }
inline bool le(long long a, long long b) { return a <= b; }
inline int sign(long long x) { return eq(x, 0) ? 0 : (x < 0 ? -1 : 1); }
struct point {
  long long x, y;
  point(long long tx = 0, long long ty = 0) : x(tx), y(ty) {}
  point operator+(const point& p) const { return point(x + p.x, y + p.y); }
  point operator-(const point& p) const { return point(x - p.x, y - p.y); }
  point operator*(long long s) { return point(x * s, y * s); }
  point operator/(long long s) { return point(x / s, y / s); }
  long long operator*(const point& p) const { return x * p.x + y * p.y; }
  long long operator%(const point& p) const { return x * p.y - y * p.x; }
  long long norm_sq() { return *this * *this; }
  bool operator==(const point& p) const { return eq(x, p.x) && eq(y, p.y); }
  bool operator<(const point& p) const {
    return eq(y, p.y) ? x < p.x : y < p.y;
  }
};
ostream& operator<<(ostream& os, point p) {
  return os << "(" << p.x << ", " << p.y << ")";
}
int ccw(point a, point b, point c) { return sign((b - a) % (c - b)); }
void sortCircular(vector<pair<point, int>>& events) {
  vector<pair<point, int>> upper, lower;
  for (pair<point, int>& e : events) {
    if (point() < e.first)
      upper.push_back(e);
    else
      lower.push_back(e);
  }
  auto cmp = [](pair<point, int> lef, pair<point, int> rig) {
    int dir = sign(lef.first % rig.first);
    if (dir == 0) return lef.second < rig.second;
    return dir > 0;
  };
  sort(upper.begin(), upper.end(), cmp);
  sort(lower.begin(), lower.end(), cmp);
  for (int i = 0; i < (int)upper.size(); ++i) events[i] = upper[i];
  for (int i = 0; i < (int)lower.size(); ++i)
    events[i + upper.size()] = lower[i];
}
long long C(int n, int k) {
  if (k < 0 || n < 0 || k > n) return 0;
  long long ret = 1;
  for (int i = 0; i < k; ++i) {
    ret *= (n - i);
  }
  for (int i = 0; i < k; ++i) {
    ret /= (i + 1);
  }
  return ret;
}
int main() {
  vector<point> points;
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    int x, y;
    scanf("%d %d", &x, &y);
    points.push_back(point(x, y));
  }
  long long X = 0, Y = 0;
  for (int i = 0; i < n; ++i) {
    vector<pair<point, int>> events;
    for (int j = 0; j < n; ++j) {
      if (i == j) continue;
      events.emplace_back(points[j] - points[i], j);
      events.emplace_back(points[i] - points[j], ~j);
    }
    sortCircular(events);
    vector<bool> visible(n, false);
    int count = 0;
    for (auto it : events) {
      int v = it.second;
      if (v < 0) {
        v = ~v;
        count -= visible[v];
        visible[v] = false;
      } else {
        count += !visible[v];
        visible[v] = true;
      }
    }
    for (auto it : events) {
      int v = it.second;
      if (v < 0) {
        v = ~v;
        assert(visible[v]);
        count -= visible[v];
        visible[v] = false;
      } else {
        assert(!visible[v]);
        int other = n - 2 - count;
        X += C(count, 2) * other;
        Y += C(count, 3);
        count += !visible[v];
        visible[v] = true;
      }
    }
  }
  long long ans = (X - Y) / 2;
  printf("%lld\n", ans);
  return 0;
}
