题解:B4189 [中山市赛 2024] 树上开花
题解:B4189 [中山市赛 2024] 树上开花
upd:2025-11-08,改正了一些错误的小细节。
对于树上的一个非叶子节点
但这样计算还不够方便,化简一下,可以变为:
但是暴力枚举的时间在树为链的情况下可以达到
对了,由于对于每一对点对
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005;
int n,a[N],x,y,ans;
vector<int> g[N];
int d[N];
void yin(int x){
for(int i=1;i*i<=x;i++){
if(x%i==0){
d[i]++;
if(i!=x/i){
d[x/i]++;
}
}
}
}
void dfs(int u,int fa){
int sum=0;
yin(a[u]);
sum=1;
for(int v:g[u]){
if(v==fa)continue;
int yuan=d[a[u]];
dfs(v,u);
int geng=d[a[u]]-yuan;
// cout<<"u:"<<u<<" sum:"<<sum<<" geng:"<<geng<<endl;
ans+=(sum*geng);
// cout<<"ans:"<<ans<<endl;
sum+=geng;
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1,0);
cout<<ans*2+n;
}
提交记录