//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define file "tripoint"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re return 0
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll ran(ll l, ll r)
{
return uniform_int_distribution<ll> (l, r)(rng);
}
inline void rf()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen(file".inp","r"))
{
freopen(file".inp","r",stdin);
freopen(file".out","w",stdout);
}
}
const int mod=998244353;
const int maxn=2005;
const ll inf=5e16;
template<typename T> inline void add(T &x, const T &y)
{
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
template<typename T> inline bool maxi(T &a, T b)
{
if(a>=b) return 0;
a=b; return 1;
}
template<typename T> inline bool mini(T &a, T b)
{
if(a<=b) return 0;
a=b; return 1;
}
struct point{
ll x,y;
};
struct vect{
ll x,y;
};
ll my_gcd(ll a, ll b)
{
a = abs(a);
b = abs(b);
while (b) {
a %= b;
swap(a, b);
}
return a;
}
vect create_vect(point p1,point p2)
{
ll dx = p2.x - p1.x;
ll dy = p2.y - p1.y;
ll u = my_gcd(dx, dy);
if (u == 0) u = 1;
if (dx < 0 || (dx == 0 && dy < 0)) {
u = -u;
}
return (vect){dx / u, dy / u};
}
int n;
point a[maxn];
unordered_map<ll,int> mp;
void prc1()
{
ll res=0;
cin >> n;
ff(i, 1, n)
{
cin >> a[i].x >> a[i].y;
}
ff(i, 1, n)
{
mp.clear();
ff(j, i+1, n)
{
vect vt=create_vect(a[i],a[j]);
mp[vt.x*2000000000LL+vt.y]++;
}
for(auto const& [key, count] : mp)
{
res+=(ll)count*((ll)count-1)/2;
}
}
cout << res << nl;
}
signed main()
{
rf();
prc1();
re;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsdHVuZT1uYXRpdmUiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmlsZSAidHJpcG9pbnQiCiNkZWZpbmUgZmYoaSwgYSwgYikgZm9yKGF1dG8gaT0oYSk7IGk8PShiKTsgKytpKQojZGVmaW5lIGZmcihpLCBiLCBhKSBmb3IoYXV0byBpPShiKTsgaT49KGEpOyAtLWkpCiNkZWZpbmUgbmwgIlxuIgojZGVmaW5lIHNzICIgIgojZGVmaW5lIHBiIGVtcGxhY2VfYmFjawojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgc3oocykgKGludClzLnNpemUoKQojZGVmaW5lIGFsbChzKSAocykuYmVnaW4oKSwgKHMpLmVuZCgpCiNkZWZpbmUgbXMoYSx4KSBtZW1zZXQoYSwgeCwgc2l6ZW9mIChhKSkKI2RlZmluZSBjbiBjb250aW51ZQojZGVmaW5lIHJlIHJldHVybiAwCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIHZlY3RvcjxsbD4gdmxsOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHBpaTsKdHlwZWRlZiBwYWlyPGxsLCBsbD4gcGxsOwp0eXBlZGVmIHZlY3RvcjxwaWk+IHZwaWk7CnR5cGVkZWYgdmVjdG9yPHBsbD4gdnBsbDsKCm10MTk5MzdfNjQgcm5nKGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7CmxsIHJhbihsbCBsLCBsbCByKQp7CiAgICByZXR1cm4gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGxsPiAobCwgcikocm5nKTsKfQoKaW5saW5lIHZvaWQgcmYoKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwogICAgaWYoZm9wZW4oZmlsZSIuaW5wIiwiciIpKQogICAgewogICAgICAgIGZyZW9wZW4oZmlsZSIuaW5wIiwiciIsc3RkaW4pOwogICAgICAgIGZyZW9wZW4oZmlsZSIub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KfQoKY29uc3QgaW50IG1vZD05OTgyNDQzNTM7CmNvbnN0IGludCBtYXhuPTIwMDU7CmNvbnN0IGxsIGluZj01ZTE2OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgYWRkKFQgJngsIGNvbnN0IFQgJnkpCnsKICAgIHgrPXk7CiAgICBpZih4Pj1tb2QpIHgtPW1vZDsKICAgIGlmKHg8MCkgeCs9bW9kOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgYm9vbCBtYXhpKFQgJmEsIFQgYikKewogICAgaWYoYT49YikgcmV0dXJuIDA7CiAgICBhPWI7IHJldHVybiAxOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgYm9vbCBtaW5pKFQgJmEsIFQgYikKewogICAgaWYoYTw9YikgcmV0dXJuIDA7CiAgICBhPWI7IHJldHVybiAxOwp9CgpzdHJ1Y3QgcG9pbnR7CiAgICBsbCB4LHk7Cn07CgpzdHJ1Y3QgdmVjdHsKICAgIGxsIHgseTsKfTsKCmxsIG15X2djZChsbCBhLCBsbCBiKSAKewogICAgYSA9IGFicyhhKTsKICAgIGIgPSBhYnMoYik7CiAgICB3aGlsZSAoYikgewogICAgICAgIGEgJT0gYjsKICAgICAgICBzd2FwKGEsIGIpOwogICAgfQogICAgcmV0dXJuIGE7Cn0KCnZlY3QgY3JlYXRlX3ZlY3QocG9pbnQgcDEscG9pbnQgcDIpCnsKICAgIGxsIGR4ID0gcDIueCAtIHAxLng7CiAgICBsbCBkeSA9IHAyLnkgLSBwMS55OwogICAgbGwgdSA9IG15X2djZChkeCwgZHkpOwogICAgCiAgICBpZiAodSA9PSAwKSB1ID0gMTsKCiAgICBpZiAoZHggPCAwIHx8IChkeCA9PSAwICYmIGR5IDwgMCkpIHsKICAgICAgICB1ID0gLXU7CiAgICB9CgogICAgcmV0dXJuICh2ZWN0KXtkeCAvIHUsIGR5IC8gdX07Cn0KCgppbnQgbjsKcG9pbnQgYVttYXhuXTsgCnVub3JkZXJlZF9tYXA8bGwsaW50PiBtcDsgCgp2b2lkIHByYzEoKQp7CiAgICBsbCByZXM9MDsKICAgIGNpbiA+PiBuOwogICAgZmYoaSwgMSwgbikKICAgIHsKICAgICAgICBjaW4gPj4gYVtpXS54ID4+IGFbaV0ueTsKICAgIH0KICAgIAogICAgZmYoaSwgMSwgbikKICAgIHsKICAgICAgICBtcC5jbGVhcigpOwogICAgICAgIGZmKGosIGkrMSwgbikgCiAgICAgICAgewogICAgICAgICAgICB2ZWN0IHZ0PWNyZWF0ZV92ZWN0KGFbaV0sYVtqXSk7CiAgICAgICAgICAgIG1wW3Z0LngqMjAwMDAwMDAwMExMK3Z0LnldKys7IAogICAgICAgIH0KCiAgICAgICAgZm9yKGF1dG8gY29uc3QmIFtrZXksIGNvdW50XSA6IG1wKSAKICAgICAgICB7CiAgICAgICAgICAgIHJlcys9KGxsKWNvdW50KigobGwpY291bnQtMSkvMjsKICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8IHJlcyA8PCBubDsgCn0KCnNpZ25lZCBtYWluKCkKewogICAgcmYoKTsKICAgIHByYzEoKTsgCiAgICByZTsgCn0=