#include <bits/stdc++.h>
using namespace std;
int N, divide;
int X_axe[2010], Y_axe[2010];
long long collinear, triangles;
pair<int, int> slope;
map<pair<int, int>, long long> keep_slopes;
pair<int, int> find_slope(int x1, int y1, int x2, int y2) {
  return make_pair(y2 - y1, x2 - x1);
}
int gcd(int a, int b) {
  int min_v = min(a, b);
  int max_v = max(a, b);
  while (min_v) {
    int temp = min_v;
    min_v = max_v % min_v;
    max_v = temp;
  }
  return max_v;
}
void fix_slope() {
  divide = gcd(abs(slope.first), abs(slope.second));
  if (slope.first < 0 && slope.second < 0)
    slope = make_pair(-slope.first / divide, -slope.second / divide);
  else if (slope.first < 0 || slope.second < 0)
    slope = make_pair(-abs(slope.first) / divide, abs(slope.second) / divide);
  else
    slope = make_pair(slope.first / divide, slope.second / divide);
}
int main() {
  scanf("%d", &N);
  for (auto i = 0 - (0 > N); i != N - (0 > N); i += 1 - 2 * (0 > N))
    scanf("%d%d", X_axe + i, Y_axe + i);
  for (auto i = 0 - (0 > N); i != N - (0 > N); i += 1 - 2 * (0 > N)) {
    keep_slopes.clear();
    for (auto j = 0 - (0 > N); j != N - (0 > N); j += 1 - 2 * (0 > N)) {
      if (i != j) {
        if (X_axe[j] - X_axe[i] != 0)
          slope = find_slope(X_axe[i], Y_axe[i], X_axe[j], Y_axe[j]);
        else
          slope = make_pair(1, 0);
        if (slope != make_pair(1, 0)) fix_slope();
        if (!keep_slopes.count(slope))
          keep_slopes.insert(make_pair(slope, 1));
        else
          ++keep_slopes[slope];
      }
    }
    for (auto v : keep_slopes) collinear += (v.second * (v.second - 1)) / 2LL;
  }
  collinear /= 3LL;
  triangles = (((long long)N * (long long)(N - 1) * (long long)(N - 2)) / 6) -
              collinear;
  printf("%I64d\n", triangles);
  return 0;
}
