给你一个整数 n,以及一棵以节点 0 为根、包含 n 个节点(编号从 0 到 n - 1)的无向树。该树由一个长度为 n - 1 的二维数组 edges 表示,其中 edges[i] = [ui, vi] 表示在节点 ui 与节点 vi 之间有一条无向边。
同时给你一个整数数组 nums,其中 nums[i] 是分配给节点 i 的正整数。
定义值 ti 为:节点 i 的 祖先 节点中,满足乘积 nums[i] * nums[ancestor] 为 完全平方数 的祖先个数。
请返回所有节点 i(范围为 [1, n - 1])的 ti 之和。
说明:
i 的祖先是指从节点 i 到根节点 0 的路径上、不包括 i 本身的所有节点。1、4、9、16。
示例 1:
输入: n = 3, edges = [[0,1],[1,2]], nums = [2,8,2]
输出: 3
解释:
i |
祖先 | nums[i] * nums[ancestor] |
平方数检查 | ti |
|---|---|---|---|---|
| 1 | [0] | nums[1] * nums[0] = 8 * 2 = 16 |
16 是完全平方数 | 1 |
| 2 | [1, 0] | nums[2] * nums[1] = 2 * 8 = 16nums[2] * nums[0] = 2 * 2 = 4 |
4 和 16 都是完全平方数 | 2 |
因此,所有非根节点的有效祖先配对总数为 1 + 2 = 3。
示例 2:
输入: n = 3, edges = [[0,1],[0,2]], nums = [1,2,4]
输出: 1
解释:
i |
祖先 | nums[i] * nums[ancestor] |
平方数检查 | ti |
|---|---|---|---|---|
| 1 | [0] | nums[1] * nums[0] = 2 * 1 = 2 |
2 不是 完全平方数 | 0 |
| 2 | [0] | nums[2] * nums[0] = 4 * 1 = 4 |
4 是完全平方数 | 1 |
因此,所有非根节点的有效祖先配对总数为 1。
示例 3:
输入: n = 4, edges = [[0,1],[0,2],[1,3]], nums = [1,2,9,4]
输出: 2
解释:
i |
祖先 | nums[i] * nums[ancestor] |
平方数检查 | ti |
|---|---|---|---|---|
| 1 | [0] | nums[1] * nums[0] = 2 * 1 = 2 |
2 不是 完全平方数 | 0 |
| 2 | [0] | nums[2] * nums[0] = 9 * 1 = 9 |
9 是完全平方数 | 1 |
| 3 | [1, 0] | nums[3] * nums[1] = 4 * 2 = 8nums[3] * nums[0] = 4 * 1 = 4 |
只有 4 是完全平方数 | 1 |
因此,所有非根节点的有效祖先配对总数为 0 + 1 + 1 = 2。
提示:
1 <= n <= 105edges.length == n - 1edges[i] = [ui, vi]0 <= ui, vi <= n - 1nums.length == n1 <= nums[i] <= 105edges 表示一棵有效的树。