列表

详情


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;
}

上一题