NC235690. 孤独的树
描述
给出一棵 个点 条边的树。树的节点为 ,节点 具有权值 。每次操作选择一个节点 ,再选择 的一个质因子 ,然后令 。问:最少操作几次,才能让这棵树变成一棵孤独的树。
孤独的树的定义:不存在一条边连接的两个节点 ,。
输入描述
第一行包含一个整数 ,代表树的节点个数。
第二行包含 个整数 ,分别表示 个节点。
接下来包含 行,每行包含两个整数 ,表示这棵树的边。
输出描述
输出一行包含一个整数,代表最少操作次数。
示例1
输入:
4 2 8 2 1 1 2 2 3 3 4
输出:
2
说明:
如果对节点 操作,需要 次。对节点 和 分别操作 次即可。C++ 解法, 执行用时: 128ms, 内存消耗: 6412K, 提交时间: 2022-04-22 20:57:57
#include<bits/stdc++.h> using namespace std; int n; int ans; int vl[100010]; vector<int>v[100010]; int sum(int x) { int s = 0; for(int i = 2; i <= x; i ++ ) { while(1) { if(x % i == 0) x /= i, s ++; else break; } } return s; } void dfs(int u, int pre) { for(int i = 0; i < v[u].size(); i ++ ) { if(v[u][i] == pre) continue; dfs(v[u][i], u); int s = __gcd(vl[u], vl[v[u][i]]); vl[u] /= s; int k = sum(s); ans += k; } } signed main() { cin >> n; for(int i = 1; i <= n; i ++ ) cin >> vl[i]; for(int i = 1; i <= n - 1; i ++ ) { int x,y; cin >> x >> y; v[x].push_back(y); v[y].push_back(x); } dfs(1, 1); cout << ans; return 0; }