题目链接
思路:可以dfs到该节点时保存一下自身为0时的gcd。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+1;
int n,u,v,a[maxn];
set<int>s[maxn];
vector<int>g[maxn];
void dfs(int u,int fa,int gcd)
{
s[u].insert(__gcd(gcd,a[u]));
s[u].insert(gcd);
for(auto it=s[fa].begin();it!=s[fa].end();it++)
s[u].insert(__gcd(*it,a[u]));
gcd=__gcd(gcd,a[u]);
for(int to:g[u])
{
if(to==fa) continue;
dfs(to,u,gcd);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<n;++i)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0,0);
for(int i=1;i<=n;++i) printf("%d ",*s[i].rbegin());
}