#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 1000;
const double INF = 100000000.0;
pair<int, int> vec[1 + NMAX];
vector<double> pante;
double epsilon = 0.001;
bool maiMicPrimul(double a, double b)
{
return (b - a) > epsilon;
}
bool egal(double a, double b)
{
return (abs(b - a)) < epsilon;
}
int main()
{
ifstream in("trapez.in");
ofstream out("trapez.out");
int n;
in >> n;
for (int i = 1; i <= n; i++)
{
in >> vec[i].first >> vec[i].second;
for (int j = 1; j < i; j++)
{
if (egal(vec[j].first - vec[i].first, 0.0))
{
pante.push_back(INF);
}
else
{
pante.push_back((1.0 * (vec[j].second - vec[i].second)) / (1.0 * (vec[j].first - vec[i].first)));
}
}
}
sort(pante.begin(), pante.end());
int sol = 0;
double val = pante[0];
int nr = 1;
for (int i = 1; i < pante.size(); i++)
{
if (egal(val, pante[i]))
{
nr++;
}
else
{
sol += nr * (nr - 1) / 2;
val = pante[i];
nr = 1;
}
}
sol += nr * (nr - 1) / 2;
out << sol << '\n';
return 0;
}