/* 因为质因子很少 状态转移时用dp[u][i]表示结点u的第i个质因子所在的最大深度即可 等价于带限制的求直径 */ #include<bits/stdc++.h> #include<vector> using namespace std; #define maxn 200005 int n,a[maxn],ans; vector<int>G[maxn],p[maxn],dp[maxn]; void dfs(int u,int pre){ for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==pre)continue; dfs(v,u); //枚举u,v中相等的质因子 for(int i=0;i<p[u].size();i++) for(int j=0;j<p[v].size();j++) if(p[u][i]==p[v][j]){ ans=max(ans,dp[u][i]+dp[v][j]); dp[u][i]=max(dp[u][i],dp[v][j]+1); } } } void divide(int x,int u){//求出每个点的质因子 for(int i=2;i*i<=x;i++) if(x%i==0){ p[u].push_back(i); dp[u].push_back(1); while(x%i==0)x/=i; } if(x>1){//对于所有点 p[u].push_back(x); dp[u].push_back(1); } } int main(){ cin>>n; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++) if(a[i]!=1){ divide(a[i],i); ans=1; } 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); } /* for(int i=1;i<=n;i++){ for(int j=0;j<p[i].size();j++) cout<<p[i][j]<<endl; } */ dfs(1,1); cout<<ans<<endl; }