#include <bits/stdc++.h>
using namespace std;
struct point {
  long x, y;
};
long long n, i, j, cnt, k, ans;
float b[2010];
point a[2010];
long long max(long long x, long long y) { return x > y ? x : y; }
long long min(long long x, long long y) { return x > y ? y : x; }
long long power(long long a, long long x) {
  if (x == 0) return 1LL;
  if (x == 1) return a;
  long long tmp = power(a, x >> 1);
  tmp = (tmp) * (tmp);
  return (x & 1) ? (tmp * a) : tmp;
}
string IntToStr(long x) {
  string tmp = "";
  int l = trunc(log(x)) + 1, i;
  do {
    i = power(10, l);
    tmp = tmp + char(x / i + 48);
    x -= x / i * i;
    l--;
  } while (l >= 0);
  return tmp;
}
long long StrToInt(string x) {
  long long tmp = 0;
  for (long i = 0; i < x.length(); i++) tmp = tmp * 10 + int(x[i]) - 48;
  return tmp;
}
long long C3(long long x) {
  if (x <= 0) return 0LL;
  return (x * (x - 1LL) * (x - 2LL)) / 6;
}
int main() {
  scanf("%ld", &n);
  for (i = 1; i <= n; ++i) scanf("%ld%ld", &a[i].x, &a[i].y);
  ans = C3(n);
  for (i = 1; i <= n; ++i) {
    cnt = 0;
    for (j = i + 1; j <= n; ++j) {
      if (a[j].y - a[i].y == 0)
        b[++cnt] = 999999999;
      else
        b[++cnt] = float(a[j].x - a[i].x) / (a[j].y - a[i].y);
    }
    sort(b + 1, b + cnt + 1);
    for (j = 1; j <= cnt; ++j) {
      k = j + 1;
      while (k <= cnt && b[k] == b[k - 1]) k++;
      ans -= (k - j - 1LL) * (k - j) / 2;
      j = k - 1;
    }
  }
  printf("%I64d", ans);
  return 0;
}
