import
java.util.*;
class
Pair<T, U> {
T first;
U second;
Pair(T first, U second)
{
this
.first = first;
this
.second = second;
}
@Override
public
boolean
equals(Object o)
{
if
(!(o
instanceof
Pair)) {
return
false
;
}
Pair<?, ?> p = (Pair<?, ?>)o;
return
Objects.equals(p.first, first)
&& Objects.equals(p.second, second);
}
@Override
public
int
hashCode()
{
return
Objects.hash(first, second);
}
}
class
GFG {
static
int
gcd(
int
a,
int
b)
{
int
i;
if
(a < b)
i = a;
else
i = b;
for
(i = i; i >
1
; i--) {
if
(a % i ==
0
&& b % i ==
0
)
return
i;
}
return
1
;
}
public
static
int
totalPairsOfIntersectingLines(
int
[] X,
int
[] Y,
int
N)
{
Set<Pair<Pair<Integer, Integer>,
Pair<Integer, Integer> > > st
=
new
HashSet<>();
Map<Pair<Integer, Integer>, Integer> mp
=
new
HashMap<>();
for
(
int
i =
0
; i < N; i++) {
for
(
int
j = i +
1
; j < N; j++) {
int
dx = X[j] - X[i];
int
dy = Y[j] - Y[i];
int
g = gcd(dx, dy);
dx /= g;
dy /= g;
if
(dx ==
0
) {
int
c1, c2;
c1 = X[i];
c2 = Integer.MAX_VALUE;
Pair<Pair<Integer, Integer>,
Pair<Integer, Integer> > pr
=
new
Pair<>(
new
Pair<>(dx, dy),
new
Pair<>(c1, c2));
if
(st.contains(pr)) {
}
else
{
st.add(pr);
mp.put(pr.first,
mp.getOrDefault(pr.first,
0
)
+
1
);
}
}
else
if
(dy ==
0
) {
int
c1, c2;
c2 = Y[i];
c1 = Integer.MAX_VALUE;
Pair<Pair<Integer, Integer>,
Pair<Integer, Integer> > pr
=
new
Pair<>(
new
Pair<>(dx, dy),
new
Pair<>(c1, c2));
if
(st.contains(pr)) {
}
else
{
st.add(pr);
mp.put(pr.first,
mp.getOrDefault(pr.first,
0
)
+
1
);
}
}
else
{
int
c1, c2;
if
(dx >
0
&& dy <
0
) {
dx *= -
1
;
dy *= -
1
;
}
c1 = Y[i] * dx - dy * X[i];
c2 = dx;
int
g2 = gcd(c1, c2);
c1 /= g2;
c2 /= g2;
Pair<Pair<Integer, Integer>,
Pair<Integer, Integer> > pr
=
new
Pair<>(
new
Pair<>(dx, dy),
new
Pair<>(c1, c2));
if
(st.contains(pr)) {
}
else
{
st.add(pr);
if
(!mp.containsKey(pr.first))
mp.put(pr.first,
0
);
mp.put(pr.first,
1
+ mp.get(pr.first));
}
}
}
}
ArrayList<Integer> v =
new
ArrayList<Integer>();
for
(var count : mp.entrySet()) {
v.add(count.getValue());
}
int
cnt =
0
;
for
(
int
val : v)
cnt += val;
int
ans = -
1
;
for
(
int
i =
0
; i < v.size(); i++) {
cnt -= v.get(i);
ans += cnt * v.get(i);
}
return
ans;
}
public
static
void
main(String[] args)
{
int
N =
4
;
int
[] X = {
0
,
1
,
0
,
1
};
int
[] Y = {
0
,
1
,
3
,
2
};
System.out.println(
totalPairsOfIntersectingLines(X, Y, N));
}
}