#include <bits/stdc++.h>
using namespace std;
int n;
int x, y;
map<pair<int, int>, int> slopes;
map<pair<int, int>, unordered_set<int> > slope_to_c;
vector<pair<int, int> > poles;
map<pair<int, int>, bool> uni;
int gcd(int a, int b) {
  if (b == 0) {
    return a;
  } else {
    return gcd(b, a % b);
  }
}
int main(int argc, char* argv[]) {
  ios::sync_with_stdio(false);
  cin >> n;
  poles.resize(n);
  for (int i = 0; i < n; ++i) {
    cin >> x >> y;
    poles[i].first = x;
    poles[i].second = y;
  }
  long long ans = 0;
  long long cnt = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      int a = poles[i].second - poles[j].second;
      int b = -(poles[i].first - poles[j].first);
      int c = -a * poles[i].first - b * poles[i].second;
      int div = gcd(abs(a), gcd(abs(b), abs(c)));
      a /= div;
      b /= div;
      c /= div;
      if (a < 0 || (a == 0 && b < 0)) a *= -1, b *= -1, c *= -1;
      pair<int, int> p = make_pair(a, b);
      if (uni[p] == true) {
        pair<int, int> p = make_pair(a, b);
        if (slope_to_c[p].find(c) == slope_to_c[p].end()) {
          slope_to_c[p].insert(c);
          ++slopes[p];
          ++cnt;
        } else {
          continue;
        }
      } else {
        slope_to_c[p].insert(c);
        ++slopes[p];
        uni[p] = true;
        ++cnt;
      }
      ans += (cnt - slopes[p]);
    }
  }
  cout << ans << endl;
  return 0;
}
