题意:给一张图,每个节点有一个权值,一个节点的beauty值=gcd(root to now's weight) 【允许在一条路径上有一个数为0】,求出每个节点的最大beauty值
思路:对于当前的数x,其beauty值有两种情况
① 把这个数设为0,前面所有值是原值
②这个数是原来的数,前面的值都是原值 || 父亲满足的情况
#include<bits/stdc++.h>
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
const int N=2e5+6;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
vector <int> edge[N];
set<int> st[N];
int a[N],vis[N];
void dfs(int u,int fa,int gcd){
st[u].insert(__gcd(gcd,a[u])); // ALL GCD
st[u].insert(gcd); // let a[u]=0
for(set<int>::iterator it=st[fa].begin();it!=st[fa].end();it++){
int t=*it;
st[u].insert(__gcd(t,a[u]));
}
gcd=__gcd(gcd,a[u]);
vis[u]=1;
for(int i=0;i<edge[u].size();++i){
int v=edge[u][i];
if(!vis[v]){
dfs(v,u,gcd);
}
}
}
int main(void){
int n;
cin >> n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs(1,0,0);
for(int i=1;i<=n;i++){
if(i==1) printf("%d",*st[i].rbegin());
else printf(" %d",*st[i].rbegin());
}
return 0;
}