0
点赞
收藏
分享

微信扫一扫

F. 孤独的树 思维

悬灸人雪洋 2022-04-24 阅读 39
算法

link
思维, 正解是一个感觉挺复杂的树形dp,有空补一下。
牛客的小白赛,官方视频题解

题意

在这里插入图片描述

思路

乱搞的,,其实并不知道为什么对,但确实过了这道题。
先预处理出 c[i] 数组,表示 i 的质因子个数。
然后任选一个点开始 dfs, 找每个点和它子节点的gcd, 贪心地修改父节点。

代码

int c[100010], a[100010];
int n;
vector<int> e[100010];
int ans = 0;
int gcd(int a, int b) {
	if(!b) return a;
	return gcd(b, a % b);
}
void dfs(int cur = 1, int fa = 0) {
	for(auto to : e[cur]) {
		if(to == fa) continue;
		dfs(to, cur);
		int t = gcd(a[cur], a[to]);
		ans += c[t];
		a[cur]/=t;
	}
}
void solve() {
    for(int i=2;i<=100000;i++){
        if(!c[i]){
            c[i]=1;
            for(int j=i+i;j<=100000;j+=i){
                int t=j;
                while(t%i==0) t/=i,c[j]++;
            }
        }
    }
    cin >> n;
    for(int i = 1; i <= n; i++) {
    	cin >> a[i];
    }
    for(int i = 1; i < n; i++) {
    	int u, v;
    	cin >> u >> v;
    	e[u].push_back(v);
    	e[v].push_back(u);
    }
    dfs();
    cout << ans << endl;
}
举报

相关推荐

0 条评论