#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
const int Q = 1e9 + 7;
struct Point {
  int x, y;
  Point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
  const int sign() const { return y < 0 || y == 0 && x < 0; }
  Point operator-(const Point &R) { return Point(x - R.x, y - R.y); }
  long long operator^(const Point &R) const {
    return (long long)x * R.y - (long long)y * R.x;
  }
  bool operator<(const Point &R) const {
    if (sign() != R.sign()) {
      return sign() < R.sign();
    }
    return (*this ^ R) > 0;
  }
};
inline void add(long long &A, long long B) { A += B; }
Point p[N];
int n;
long long f[6][N][N];
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", &p[i].x, &p[i].y);
    f[0][i][i] = 1;
  }
  vector<tuple<Point, int, int>> v;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < i; ++j) {
      v.emplace_back(p[j] - p[i], i, j);
      v.emplace_back(p[i] - p[j], j, i);
    }
  }
  sort(v.begin(), v.end());
  for (auto &it : v) {
    int x = get<1>(it);
    int y = get<2>(it);
    for (int i = 5; i > 0; --i) {
      for (int j = 0; j < n; ++j) {
        add(f[i][j][y], f[i - 1][j][x]);
      }
    }
  }
  long long res = 0;
  for (int i = 0; i < n; ++i) {
    add(res, f[5][i][i]);
  }
  cout << res << endl;
}
