跳到主要内容

1766.互质树

链接:1766.互质树
难度:Hard
标签:树、深度优先搜索、数组、数学、数论
简介:请你返回一个大小为 n 的数组 ans ,其中 ans[i]是离节点 i 最近的祖先节点且满足 nums[i] 和 nums[ans[i]] 是 互质的 ,如果不存在这样的祖先节点,ans[i] 为 -1 。

题解 1 - python

  • 编辑时间:2024-04-11
  • 执行用时:1017ms
  • 内存消耗:66.86MB
  • 编程语言:python
  • 解法介绍:预处理后dfs。
primes = [0 for _ in range(51)]
for num1 in range(1, 51):
for num2 in range(1, 51):
if gcd(num1, num2) == 1:
primes[num1] |= 1 << num2
primes[num2] |= 1 << num1

class Solution:
def getCoprimes(self, nums: List[int], edges: List[List[int]]) -> List[int]:
n = len(nums)
nodes = [[] for _ in range(n)]
for n1, n2 in edges:
nodes[n1].append(n2)
nodes[n2].append(n1)
ans = [-1 for _ in range(n)]
def dfs(node: int, arr: List[Tuple[int, int]], parent: int, level: int):
num1 = nums[node]
cur = (-1, -1)
for num2 in range(1, 51):
if arr[num2][0] != -1 and primes[num1] & (1 << num2) and (cur[1] == -1 or arr[num2][1] > cur[1]):
cur = arr[num2]
ans[node] = cur[0]
oldv = arr[num1]
arr[num1] = (node, level)
for child in nodes[node]:
if child != parent:
dfs(child, arr, node, level + 1)
arr[num1] = oldv
dfs(0, [(-1, -1) for _ in range(51)], -1, 0)
return ans