#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int h[N],e[N],ne[N],w[N],idx,n;
void add(int a,int b){
e[++idx]=b;
ne[idx]=h[a];
h[a]=idx;
}
int ans=0;
unordered_map<int,bool>ddd[N];
unordered_map<int,int>mem1[N];
int query(int u,int fa,int g){
if(ddd[u][g]) return mem1[u][g];
ddd[u][g]=1;
if(w[u]%g){
mem1[u][g]=1;
return 0;
}
int t=0;
for(int i=h[u];i;i=ne[i]){
int j=e[i];
if(j==fa) continue;
t=max(t,query(j,u,g));
}
mem1[u][g]=t+1;
return mem1[u][g];
}
void solve(int u,int fa){
int a[10],cnt;
int y=w[u];
for(int i=2;i*i<=y;i++){
if(y%i==0){
while(y%i==0) y/=i;
a[cnt++]=i;
}
}
if(y!=1) a[cnt++]=y;
for(int k=0;k<cnt;k++){
int h1=0,h2=0;
for(int i=h[u];i;i=ne[i]){
int j=e[i];
if(j==fa) continue;
int s=query(j,u,a[k]);
if(s>h1) h2=h1,h1=s;
else if(s>h2) h2=s;
solve(j,u);
}
ans=max(ans,h1+h2+1);
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
solve(1,0);
printf("%d\n",ans);
return 0;
}
https://codeforces.com/contest/1101/submission/269041370