Skip to content

Commit 3da1cb9

Browse files
committed
Update index.ts
1 parent 56782a4 commit 3da1cb9

File tree

1 file changed

+58
-51
lines changed

1 file changed

+58
-51
lines changed

tree-of-coprimes/index.ts

Lines changed: 58 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,58 @@
1-
export default getCoprimes;
2-
function getCoprimes(nums: number[], edges: number[][]): number[] {
3-
const edge = Array(nums.length)
4-
.fill(0)
5-
.map(() => Array<number>());
6-
for (const [a, b] of edges) {
7-
edge[a].push(b);
8-
edge[b].push(a);
9-
}
10-
11-
if (prime.length === 0) {
12-
for (const i of Array(51).keys()) {
13-
prime[i] = Array(51).fill(false);
14-
}
15-
16-
for (const i of Array(51).keys())
17-
for (let j = i; j < 51; j++) {
18-
prime[i][j] = prime[j][i] = greatestCommonDivisor(i, j) === 1;
19-
}
20-
}
21-
22-
const visited = new Set<number>();
23-
function dfs(node: number, ancestors: number[]) {
24-
if (!visited.has(node)) {
25-
visited.add(node);
26-
27-
if (ancestors.length) {
28-
for (let i = ancestors.length - 1; i >= 0; i--) {
29-
if (prime[nums[node]][nums[ancestors[i]]]) {
30-
results[node] = ancestors[i];
31-
break;
32-
}
33-
}
34-
}
35-
for (const child of edge[node]) {
36-
ancestors.push(node);
37-
dfs(child, ancestors);
38-
ancestors.pop();
39-
}
40-
}
41-
}
42-
const results: number[] = Array(nums.length).fill(-1);
43-
dfs(0, []);
44-
return results;
45-
}
46-
47-
const prime: boolean[][] = [];
48-
49-
function greatestCommonDivisor(a: number, b: number): number {
50-
return b != 0 ? greatestCommonDivisor(b, a % b) : a;
51-
}
1+
import { greatestCommonDivisor } from "../max-points-on-a-line/greatest_common_divisor.ts";
2+
3+
export default getCoprimes;
4+
function getCoprimes(nums: number[], edges: number[][]): number[] {
5+
const edge = Array(nums.length)
6+
.fill(0)
7+
.map(() => Array<number>());
8+
for (const [a, b] of edges) {
9+
edge[a].push(b);
10+
edge[b].push(a);
11+
}
12+
13+
if (prime.length === 0) {
14+
for (const i of Array(51).keys()) {
15+
prime[i] = Array(51).fill(false);
16+
}
17+
18+
for (const i of Array(51).keys()) {
19+
for (let j = i; j < 51; j++) {
20+
prime[i][j] = prime[j][i] = greatestCommonDivisor(i, j) === 1;
21+
}
22+
}
23+
}
24+
25+
const visited = new Set<number>();
26+
const currents: [number, number][][] = Array(51)
27+
.fill(0)
28+
.map(() => []);
29+
function dfs(node: number, depth: number) {
30+
if (visited.has(node)) {
31+
return;
32+
}
33+
visited.add(node);
34+
const value = nums[node];
35+
36+
let ans = [-1, -1];
37+
for (const i of Array(51).keys()) {
38+
if (currents[i].length && prime[value][i]) {
39+
const get = currents[i].at(-1) as [number, number];
40+
41+
if (get[1] > ans[1]) {
42+
ans = get;
43+
}
44+
}
45+
}
46+
results[node] = ans[0];
47+
for (const child of edge[node]) {
48+
currents[value].push([node, depth]);
49+
dfs(child, depth + 1);
50+
currents[value].pop();
51+
}
52+
}
53+
const results: number[] = Array(nums.length).fill(-1);
54+
dfs(0, 0);
55+
return results;
56+
}
57+
58+
const prime: boolean[][] = [];

0 commit comments

Comments
 (0)