#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
};
inline bool operator<(const Point &a, const Point &b) {
  if (a.x != b.x) {
    return a.x < b.x;
  } else {
    return a.y < b.y;
  }
}
inline Point operator-(const Point &a, const Point &b) {
  return Point{a.x - b.x, a.y - b.y};
}
inline Point operator+(const Point &a, const Point &b) {
  return Point{a.x + b.x, a.y + b.y};
}
ostream &operator<<(ostream &ostr, const Point &a) {
  ostr << "(" << a.x << "; " << a.y << ")";
  return ostr;
}
long long gcd(long long a, long long b) {
  a = std::abs(a), b = std::abs(b);
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
long long solve(long long n) {
  const int N = 201;
  vector<Point> pts(n);
  vector<vector<int> > field(N, vector<int>(N, 0));
  for (Point &p : pts) {
    cin >> p.x >> p.y;
    p.x += N / 2, p.y += N / 2;
    field[p.x][p.y] = 1;
  }
  sort(pts.begin(), pts.end());
  long long ret = (n * (n - 1) * (n - 2)) / 6ll;
  for (int i = 0; i < pts.size(); ++i) {
    map<pair<long long, long long>, long long> lines;
    for (int j = i + 1; j < pts.size(); ++j) {
      if (i == j) {
        continue;
      }
      const Point &a = pts[i], &b = pts[j];
      pair<long long, long long> line{b.x - a.x, b.y - a.y};
      long long g = gcd(line.first, line.second);
      line.first /= g;
      line.second /= g;
      lines[line]++;
    }
    for (const auto &t : lines) {
      const long long k = t.second;
      ret -= k * (k - 1) / 2;
    }
  }
  return ret;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n;
  while (cin >> n) {
    auto ret = solve(n);
    cout << ret << endl;
  }
  return 0;
}
