We have n cities labeled from 1 to n. Two different cities with labels
x and y are directly connected by a bidirectional road if and only if x
and y share a common divisor strictly greater than some threshold.
More formally, cities with labels x and y have a road between them if there exists an integer z such that all of the following are true:
x % z == 0,
y % z == 0, and
z > threshold.
Given the two integers, n and threshold, and an array of queries, you must determine for each queries[i] = [ai, bi] if cities ai and bi are connected directly or indirectly. (i.e. there is some path between them).
Return an arrayanswer, whereanswer.length == queries.lengthandanswer[i]istrueif for theithquery, there is a path betweenaiandbi, oranswer[i]isfalseif there is no path.

Input: n =6, threshold =2, queries =[[1,4],[2,5],[3,6]]Output: [false,false,true]Explanation: The divisors for each number:1: 12: 1,23: 1, _3_
4: 1,2, _4_
5: 1, _5_
6: 1,2, _3_ , _6_
Using the underlined divisors above the threshold, only cities 3 and 6 share a common divisor, so they are the
only ones directly connected. The result of each query:[1,4]1is not connected to 4[2,5]2is not connected to 5[3,6]3is connected to 6 through path 3--6

Input: n =6, threshold =0, queries =[[4,5],[3,4],[3,2],[2,6],[1,3]]Output: [true,true,true,true,true]Explanation: The divisors for each number are the same as the previous example. However, since the threshold is0,all divisors can be used. Since all numbers share 1 as a divisor, all cities are connected.

Input: n =5, threshold =1, queries =[[4,5],[4,5],[3,2],[2,3],[3,4]]Output: [false,false,false,false,false]Explanation: Only cities 2 and 4 share a common divisor 2 which is strictly greater than the threshold 1, so they are the only ones directly connected.Please notice that there can be multiple queries for the same pair of nodes [x, y], and that the query [x, y]is equivalent to the query [y, x].
Cities are connected if they share a common divisor greater than the threshold. For each divisor d > threshold, all multiples of d are directly connected. We can use Union-Find (Disjoint Set Union) to group all such cities efficiently, then answer each query by checking if two cities are in the same group.
classSolution {
public List<Boolean>areConnected(int n, int threshold, int[][] queries) {
int[] p =newint[n + 1];
for (int i = 0; i <= n; i++) p[i]= i;
java.util.function.IntUnaryOperator find =new java.util.function.IntUnaryOperator() {
publicintapplyAsInt(int x) { return p[x]== x ? x : (p[x]= applyAsInt(p[x])); }
};
for (int d = threshold + 1; d <= n; d++) {
for (int m = 2 * d; m <= n; m += d) {
p[find.applyAsInt(d)]= find.applyAsInt(m);
}
}
List<Boolean> ans =new ArrayList<>();
for (int[] q : queries) {
ans.add(find.applyAsInt(q[0]) == find.applyAsInt(q[1]));
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution {
funareConnected(n: Int, threshold: Int, queries: Array<IntArray>): List<Boolean> {
val p = IntArray(n + 1) { it }
funfind(x: Int): Int = if (p[x] == x) x else { p[x] = find(p[x]); p[x] }
for (d in threshold + 1..n) {
var m = 2 * d
while (m <= n) {
p[find(d)] = find(m)
m += d
}
}
return queries.map { find(it[0]) == find(it[1]) }
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
defareConnected(self, n: int, threshold: int, queries: list[list[int]]) -> list[bool]:
p = list(range(n +1))
deffind(x):
if p[x] != x:
p[x] = find(p[x])
return p[x]
for d in range(threshold +1, n +1):
for m in range(2* d, n +1, d):
p[find(d)] = find(m)
return [find(a) == find(b) for a, b in queries]