#include using namespace std; using ll = long long; const int MOD = 998244353; int N; vector A; vector> G; vector primes; vector> ans; // ans[v][p_index] = 指数 // エラトステネスで素数リストを作る vector sieve(int n) { vector is_prime(n+1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= n; i++) { if (is_prime[i]) { for (int j = i * i; j <= n; j += i) { is_prime[j] = false; } } } vector ps; for (int i = 2; i <= n; i++) if (is_prime[i]) ps.push_back(i); return ps; } // 素因数分解 vector factorize(int x, const vector& primes) { vector exps(primes.size(), 0); for (int i = 0; i < (int)primes.size(); i++) { int p = primes[i]; if (p * p > x) break; while (x % p == 0) { exps[i]++; x /= p; } } if (x > 1) { // x は素数 int idx = lower_bound(primes.begin(), primes.end(), x) - primes.begin(); exps[idx]++; } return exps; } // DFSでLCMをマージ void dfs(int v, int p) { ans[v] = factorize(A[v], primes); for (int nv : G[v]) { if (nv == p) continue; dfs(nv, v); for (int i = 0; i < (int)primes.size(); i++) { ans[v][i] = max(ans[v][i], ans[nv][i]); } } } // 繰り返し二乗法 ll modpow(ll a, ll e, ll mod) { ll res = 1; while (e > 0) { if (e & 1) res = (res * a) % mod; a = (a * a) % mod; e >>= 1; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N; A.resize(N); for (int i = 0; i < N; i++) cin >> A[i]; G.assign(N, {}); for (int i = 0; i < N-1; i++) { int u, v; cin >> u >> v; u--; v--; G[u].push_back(v); G[v].push_back(u); } // 10^6 以下の素数を列挙 primes = sieve(1000000); ans.assign(N, vector(primes.size(), 0)); dfs(0, -1); for (int v = 0; v < N; v++) { ll val = 1; for (int i = 0; i < (int)primes.size(); i++) { if (ans[v][i] > 0) { val = (val * modpow(primes[i], ans[v][i], MOD)) % MOD; } } cout << val << "\n"; } }