题意:一颗树(n<2e5),每个节点有点权(x<2e5),对于每一个点权,你可以变它或者它祖先的其中一个为0,求每一个点到根节点的gcd的最大值
题解:对于每一个点,可以把每一个存它到根节点的每一个数变为0的gcd,可以知道越往下面走,gcd的可能值就越少
#include <bits/stdc++.h> #define ll long long #define maxn 200100 using namespace std; int a[maxn], g[maxn]; vector<int >G[maxn]; set<int >s[maxn]; int dfs(int x,int fax){ g[x] = __gcd(a[x], g[fax]); s[x].insert(g[fax]); for(auto i:s[fax]){ s[x].insert(__gcd(a[x], i)); } for(int i=0;i<G[x].size();i++){ int u = G[x][i]; if(u == fax) continue; dfs(u, x); } } int main(){ int n, aa, b; scanf("%d", &n); for(int i=1;i<=n;i++) scanf("%d", &a[i]); for(int i=0;i<n-1;i++){ scanf("%d%d", &aa, &b); G[aa].push_back(b); G[b].push_back(aa); } s[0].insert(0); dfs(1,0); for(int i=1;i<=n;i++) cout<<*s[i].rbegin()<<" "; cout<<endl; return 0; }