import
java.util.*;
public
class
Main {
private
static
int
find(List<Integer> parent,
int
i)
{
if
(parent.get(i) == -
1
) {
return
i;
}
parent.set(i, find(parent, parent.get(i)));
return
parent.get(i);
}
private
static
void
unionSets(List<Integer> parent,
List<Integer> rank,
int
i,
int
j)
{
int
parent_i = find(parent, i);
int
parent_j = find(parent, j);
if
(parent_i != parent_j) {
if
(rank.get(parent_i) < rank.get(parent_j)) {
parent.set(parent_i, parent_j);
}
else
if
(rank.get(parent_i)
> rank.get(parent_j)) {
parent.set(parent_j, parent_i);
}
else
{
parent.set(parent_j, parent_i);
rank.set(parent_i, rank.get(parent_i) +
1
);
}
}
}
private
static
List<Boolean>
isConnected(
int
N,
int
K, List<List<Integer> > queries)
{
List<Integer> parent =
new
ArrayList<>(
Arrays.asList(
new
Integer[N +
1
]));
List<Integer> rank =
new
ArrayList<>(
Arrays.asList(
new
Integer[N +
1
]));
for
(
int
i =
0
; i <= N; i++) {
parent.set(i, -
1
);
rank.set(i,
0
);
}
List<Boolean> results
=
new
ArrayList<>(queries.size());
for
(
int
z = K +
1
; z <= N; z++) {
for
(
int
u = z *
2
; u <= N; u += z) {
unionSets(parent, rank, z, u);
}
}
for
(List<Integer> query : queries) {
int
i = query.get(
0
);
int
j = query.get(
1
);
int
parent_i = find(parent, i);
int
parent_j = find(parent, j);
results.add(parent_i == parent_j);
}
return
results;
}
public
static
void
main(String[] args)
{
int
N1 =
6
, K1 =
2
;
List<List<Integer> > queries1
=
new
ArrayList<>(Arrays.asList(
new
ArrayList<>(Arrays.asList(
1
,
4
)),
new
ArrayList<>(Arrays.asList(
2
,
5
)),
new
ArrayList<>(Arrays.asList(
3
,
6
))));
List<Boolean> output1
= isConnected(N1, K1, queries1);
for
(
boolean
result : output1) {
System.out.print(result ?
"true "
:
"false "
);
}
System.out.println();
int
N2 =
8
, K2 =
3
;
List<List<Integer> > queries2
=
new
ArrayList<>(Arrays.asList(
new
ArrayList<>(Arrays.asList(
1
,
5
)),
new
ArrayList<>(Arrays.asList(
2
,
7
)),
new
ArrayList<>(Arrays.asList(
4
,
8
)),
new
ArrayList<>(Arrays.asList(
3
,
6
))));
List<Boolean> output2
= isConnected(N2, K2, queries2);
for
(
boolean
result : output2) {
System.out.print(result ?
"true "
:
"false "
);
}
System.out.println();
}
}