#include <bits/stdc++.h>
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using std::abs;
using std::bitset;
using std::cerr;
using std::cin;
using std::cout;
using std::map;
using std::max;
using std::min;
using std::pair;
using std::set;
using std::sort;
using std::string;
using std::swap;
using std::unordered_map;
using std::unordered_set;
using std::vector;
using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using ull = unsigned long long;
using ld = long double;
using vci = vector<int>;
using vcl = vector<ll>;
template <typename T>
void _dbg(const char* _s, T _h) {
  cerr << _s << " = " << _h << "\n";
}
template <typename T, typename... Ts>
void _dbg(const char* _s, T _h, Ts... _t) {
  int _b = 0;
  while (((_b += *_s == '(') -= *_s == ')') != 0 || *_s != ',') cerr << *_s++;
  cerr << " = " << _h << ",";
  _dbg(_s + 1, _t...);
}
struct init {
  init() {
    cin.tie(0);
    std::iostream::sync_with_stdio(0);
    cout << std::fixed << std::setprecision(10);
    cerr << std::fixed << std::setprecision(5);
  }
  ~init() {}
} init;
const int N = 2018;
struct point {
  ll x, y;
  point() {}
  point(ll _x, ll _y) : x(_x), y(_y) {}
};
std::istream& operator>>(std::istream& is, point& p) {
  return is >> p.x >> p.y;
}
std::ostream& operator<<(std::ostream& os, point& p) {
  return os << p.x << ' ' << p.y;
}
struct vc {
  ll x, y;
  vc() {}
  vc(ll _x, ll _y) : x(_x), y(_y) {}
  vc(point a, point b) {
    x = b.x - a.x;
    y = b.y - a.y;
  }
};
point operator+(point a, vc v) { return {a.x + v.x, a.y + v.y}; }
vc turn(vc a) { return {a.y, -a.x}; }
ll operator%(vc a, vc b) { return a.x * b.y - a.y * b.x; }
inline bool pr(const vc& v) { return v.y < 0 || (v.y == 0 && v.x < 0); }
point a[N];
pii ds[N * N];
bool cmp(const pii& p, const pii& q) {
  vc v1(a[p.first], a[p.second]), v2(a[q.first], a[q.second]);
  return pr(v1) == pr(v2) ? v1 % v2 > 0 : pr(v1) < pr(v2);
}
int p[N];
int w[N];
int32_t main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; ++i) cin >> a[i];
  int m = 0;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      if (i ^ j) ds[m++] = {i, j};
  sort(ds, ds + m, cmp);
  for (int i = 0; i < m; ++i) {
    vc v(a[ds[i].first], a[ds[i].second]);
  }
  std::iota(p, p + n, 0);
  point c1 = a[ds[0].first], c2 = a[ds[0].second];
  sort(p, p + n, [&c1, &c2](int p1, int p2) {
    vc v0(c1, c2);
    vc v1(c1, a[p1]);
    vc v2(c1, a[p2]);
    return v0 % v1 == v0 % v2 ? a[p1].x < a[p2].x : v0 % v1 < v0 % v2;
  });
  ;
  for (int i = 0; i < n; ++i) {
    w[p[i]] = i;
  }
  ll ans = 0;
  for (int i = 0; i < m; ++i) {
    int x = ds[i].first, y = ds[i].second;
    ;
    int ft = w[y] + 1;
    ll cup = n - ft;
    ll cdw = ft - 2;
    ll tup = (cup * (cup - 1)) / 2;
    ll tdw = (cdw * (cdw - 1)) / 2;
    ans += tup * tdw;
    swap(w[x], w[y]);
  }
  cout << ans / 2 << '\n';
  return 0;
}
