# include <bits/stdc++.h>
# define x first
# define y second
# define x0 x
# define y0 y.x
# define z0 y.y
# define ll long long
# define ld double
using namespace std;
ifstream fi("trapez.in");
ofstream fo("trapez.out");
const int nmax = 1e3 + 5;
const int pmax = 1e6 + 5;
pair < int , int > s[nmax];
pair < int , int > v[pmax];
int gcd(int a,int b)
{
return !b ? a:gcd(b,a%b);
}
int main(void)
{
int n;
fi>>n;
for (int i = 1;i <= n;++i) fi>>s[i].x>>s[i].y;
int sol = 0,N = 0;
for (int i = 1;i <= n;++i)
for (int j = i + 1;j <= n;++j) if (s[i].x == s[j].x) ++sol;
ll ans = 1ll * sol * (sol - 1) / 2ll;
sol = 0;
for (int i = 1;i <= n;++i)
for (int j = i + 1;j <= n;++j) if (s[i].y == s[j].y) ++sol;
ans += 1ll * sol * (sol - 1) / 2ll;
for (int i = 1;i <= n;++i)
for (int j = i + 1;j <= n;++j)
if (s[i].x != s[j].x && s[i].y != s[j].y)
{
int a = s[i].y - s[j].y;
int b = s[i].x - s[j].x;
if ((a < 0 && b < 0) || (a > 0 && b < 0)) a *= -1,b *= -1;
int g = gcd(abs(a),abs(b));
a /= g;b /= g;
v[++N].x = a;v[N].y = b;
}
sort(v+1,v+1+N);
for (int i = 1,j;i <= N;)
{
j = i;
while (v[i] == v[j]) ++j;
ans += 1ll * (j - i) * (j - i - 1) / 2;
i = j;
}
return fo << ans << '\n',0;
}