wa on 11,比 ans 多了 1。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned ll
#define i128 __int128
#define db double
#define ld long db
#define M 200005
#define N 100000005
#define mod 998244353
#define mod2 1222827239
#define base 51787
#define base2 38833
#define inf 1e9+7
#define dinf 1e15
#define linf 7e18
#define eps 1e-15
#define delta 0.99777
int n;
int a[M];
vector<int> g[M];
vector<int> p[M];
void work(int x,int id){
for(int i=2;i*i<=x;++i){
if(x%i==0){
p[id].push_back(i);
while(x%i==0) x/=i;
}
}
if(x>1) p[id].push_back(x);
}
int rt,siz[M],maxn[M],dep[M];
int dd;
int sum;
bool vis[M];
void dfs1(int u,int f){
siz[u]=1;
maxn[u]=0;
for(auto v:g[u]){
if(v==f||vis[v]) continue;
dfs1(v,u);
maxn[u]=max(maxn[u],siz[v]);
siz[u]+=siz[v];
}
maxn[u]=max(maxn[u],sum-siz[u]);
if(maxn[u]<maxn[rt]) rt=u;
}
void dfs2(int u,int f,int G){
if(a[u]%G) return;
dd=max(dd,dep[u]);
for(auto v:g[u]){
if(v==f||vis[v]) continue;
dep[v]=dep[u]+1;
dfs2(v,u,G);
}
}
int ans;
void dfz(int u,int f){
vis[u]=1;
int res=0;
for(auto v:g[u]){
if(v==f||vis[v]) continue;
dep[v]=1;
for(auto G:p[u]){
dd=0;
dfs2(v,u,G);
ans=max(ans,res+dd+1);
res=max(res,dd);
}
}
for(auto v:g[u]){
if(v==f||vis[v]) continue;
sum=siz[v];
rt=0;
dfs1(v,u);
dfs1(rt,0);
dfz(rt,u);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),work(a[i],i);
for(int i=1;i<n;++i){
int u,v;
scanf("%d %d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
rt=0;
maxn[rt]=inf;
sum=n;
dfs1(1,0);
dfs1(rt,0);
dfz(rt,0);
printf("%d\n",ans);
return 0;
}