fork download
  1. // Author: 4uckd3v - Nguyen Cao Duc
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int MAX_N = 2e5;
  8. const int MOD = 1e9 + 7;
  9. const int INF = 1e9;
  10.  
  11. int n;
  12. int a[MAX_N + 5], ans[MAX_N + 5];
  13. vector<int> adj[MAX_N + 5];
  14.  
  15. int __gcd(int a, int b) {
  16. return (b == 0 ? a : __gcd(b, a % b));
  17. };
  18.  
  19. void dfs(int u, int par, int gcdPath, set<int> needYou) {
  20. set<int> curNeedYou;
  21. for (int g : needYou) {
  22. curNeedYou.insert(__gcd(g, a[u]));
  23. };
  24.  
  25. curNeedYou.insert(gcdPath);
  26.  
  27. int gcdPathU = __gcd(gcdPath, a[u]);
  28.  
  29. ans[u] = max(gcdPathU, *curNeedYou.rbegin());
  30.  
  31. for (int v : adj[u]) {
  32. if (v == par) continue;
  33. dfs(v, u, gcdPathU, curNeedYou);
  34. };
  35. };
  36.  
  37. int main() {
  38. ios_base::sync_with_stdio(0);
  39. cin.tie(0);
  40. if (fopen("GCDPATH.INP", "r")) {
  41. freopen("GCDPATH.INP", "r", stdin);
  42. freopen("GCDPATH.OUT", "w", stdout);
  43. };
  44.  
  45. cin >> n;
  46. for (int i = 1; i <= n; i++) {
  47. cin >> a[i];
  48. };
  49.  
  50. for (int i = 1; i < n; i++) {
  51. int u, v;
  52. cin >> u >> v;
  53. adj[u].push_back(v);
  54. adj[v].push_back(u);
  55. };
  56.  
  57. dfs(1, 1, 0, {});
  58.  
  59. for (int u = 1; u <= n; u++) cout << ans[u] << ' ';
  60. };
Success #stdin #stdout 0.01s 8200KB
stdin
Standard input is empty
stdout
Standard output is empty