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