10
-2 1
2 -2
-1 -2
0 0
2 -1
0 -2
2 2
0 2
-1 -1
1 -2
 40
-8 24
2 -1
1 -18
72 -70
5 -4
-308 436
-19 40
36 -35
-178 265
-1 2
-7 30
-1 0
3 -2
200 -285
17 -16
-35 74
0 -4
-86 106
-1 4
-7 6
0 1
-5 4
-2 3
6 -5
-4 5
181 -262
76 -118
0 0
-7 18
-58 104
-5 6
-6 12
-3 4
1 0
11 -10
-86 130
-3 6
153 -236
-183 270
-33 64
 5
0 -1
0 -2
0 -3
0 -4
0 -5
 10
0 1
-1 -1
1 1
-1 0
1 -1
-2 -1
-2 2
-2 0
0 -2
0 -1
 20
-1 18
-2 5
-5 4
2 -33
9 -18
0 0
11 -22
2 0
-1 2
-4 41
1 6
1 -2
6 -12
0 1
-3 6
3 -6
3 -8
-1 4
2 -5
1 0
 10
2 1
-1 0
-2 -1
-1 1
0 2
2 -2
0 0
-2 -2
0 -2
-2 1
 20
-3 -3
0 4
-3 1
1 1
-1 2
-4 4
3 -1
-3 0
0 2
4 0
2 3
2 4
4 -3
-4 3
-1 1
1 3
-2 4
1 -2
1 -1
3 0
 3
0 0
0 -1
0 1
 10
2 1
-1 1
0 0
-3 1
-2 -3
-1 -2
-1 -1
1 2
3 -2
0 -2
 3
3 3
1 2
1 1
 4
0 0
1 0
2 0
3 0
 9
1 1
1 0
0 1
0 0
-1 0
-1 1
-1 -1
1 -1
0 -1
 7
1 1
-1 -1
1 0
0 1
-1 0
0 -1
0 0

4
 57
 4
 5
 21
 4
 10
 1
 1
 0
 2
 8
 3

#include <bits/stdc++.h>

typedef long long ll;

using namespace std;

class Line {
public:
  int a, b, c;
  Line(int a, int b, int c):a(a),b(b),c(c){}
  Line(int x1, int y1, int x2, int y2) {
    a = y1-y2;
    b = x2-x1;
    c = -a*x1-b*y1;
    int g = __gcd(__gcd(a,b),c);
    if (g!=0) {
      a/=g; b/=g; c/=g;
    }
    if (a<0) {
      a*=-1; b*=-1; c*=-1;
    } else if (a==0 && b<0) {
      b*=-1; c*=-1;
    }
  }
  bool operator<(const Line &v) const {
    if (a < v.a) return true;
    if (a > v.a) return false;
    if (b < v.b) return true;
    if (b > v.b) return false;
    if (c < v.c) return true;
    if (c > v.c) return false;
    return false;
  }

  friend ostream& operator<<(ostream&, const Line&);
};

ostream& operator<<(ostream &s, const Line& ln) {
  return s << "L(" << ln.a << "x+" << ln.b << "y+" << ln.c << "=0)";
}

int bsearchSqrt(int x) {
  int L=1,R=x;
  while (L<=R) {
    int M=L+(R-L)/2;
    ll v=M*M;
    if (v==x) {
      return M;
    } else if (v<x) {
      L=M+1;
    } else {
      R=M-1;
    }
  }
  return 0;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  while (scanf("%d",&n) != EOF) {
    vector<vector<int>> p(n, vector<int>(2));
    for (int i=0; i<n; i++) {
      scanf("%d%d", &p[i][0], &p[i][1]);
    }
    map<Line,int> mp;
    for (int i=0; i<n; i++) {
      for (int j=i+1; j<n; j++) {
        mp[Line(p[i][0],p[i][1],p[j][0],p[j][1])]++;
      }
    }
    ll c=0;
    for (auto it=mp.begin(); it!=mp.end(); it++) {
      if (it->second==1) continue; // only 2 points
      int r=(1+bsearchSqrt(1+4*2*(it->second)))/2;
      c+=ll(r)*(r-1)*(r-2)/6;
    }
    printf("%I64d\n",c);
  }
  return 0;
}
/*
a b c d
3+2+1=6
ab
ac
ad
bc
bd
cd

a b c d e
4+3+2+1=10

c: accumulated count in mp
c=m*(m-1)/2
m*m-m-2*c=0
positive root: r1=(1+sqrt(1+4*2*c))/2
*/