PRAVO - Tam giác vuông
Tác giả: flashmt
Ngôn ngữ: Pascal
const fi='';
fo='';
maxn=1505;
delta:real=10000000000;
type ar=array[1..maxn] of longint;
arr=array[1..maxn] of real;
var n,re,m,mm:longint;
x,y,d,dd:ar;
a,aa:arr;
procedure rf;
var i:longint;
begin
readln(n);
for i:=1 to n do readln(x[i],y[i]);
end;
procedure rotatecalc(i:longint);
var j,t,u,dem:longint;
begin
dem:=0;
for j:=1 to n do
begin
if j=i then continue;
dem:=dem+1;
t:=x[j]-x[i]; u:=y[j]-y[i];
if t=0 then a[dem]:=delta
else a[dem]:=u/t;
if u=0 then aa[dem]:=delta
else aa[dem]:=-t/u;
end;
end;
procedure sort(var a:arr;l,r:longint);
var i,j:longint; x,t:real;
begin
i:=l; j:=r; x:=a[(i+j) shr 1];
repeat
while a[i]<x do i:=i+1;
while a[j]>x do j:=j-1;
if i<=j then
begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
i:=i+1; j:=j-1;
end;
until i>j;
if i<r then sort(a,i,r);
if l<j then sort(a,l,j);
end;
procedure edit(var a:arr;var d:ar;var m:longint);
var i:longint;
begin
m:=1; d[1]:=1;
for i:=2 to n do
if a[i]<>a[m] then
begin
m:=m+1; a[m]:=a[i]; d[m]:=1;
end
else d[m]:=d[m]+1;
end;
procedure pr;
var i,j,k:longint;
begin
re:=0;
for i:=1 to n do
begin
rotatecalc(i);
sort(a,1,n-1);
sort(aa,1,n-1);
edit(a,d,m);
edit(aa,dd,mm);
j:=1; k:=1;
while (j<=m) and (k<=mm) do
begin
if a[j]<aa[k] then j:=j+1
else
begin
if a[j]=aa[k] then re:=re+d[j]*dd[k];
k:=k+1;
end;
end;
end;
end;
procedure wf;
begin
writeln(re shr 1);
end;
begin
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
rf;
pr;
wf;
close(input); close(output);
end.