#include #include using namespace std; using i32 = int; using i64 = long long; using f64 = double; using p2 = pair; using el = tuple; using mint = atcoder::modint998244353; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); } i64 n; i64 a[500000]; map fac[500000]; mint ans[500000]; mint dp[500000]; vector g[500000]; void dfs(i64 v, i64 par) { dp[v] = a[v]; for (i64 nv : g[v]) { if (nv == par) continue; dfs(nv, v); if (fac[v].size() > fac[nv].size()) { for (auto [p, cs] : fac[nv]) { auto [c, s] = cs; if (!fac[v].count(p)) { dp[v] *= s; fac[v][p] = {c, s}; } else if (fac[v][p].first < c) { dp[v] /= fac[v][p].second; dp[v] *= s; fac[v][p] = {c, s}; } } fac[nv].clear(); } else { swap(dp[v], dp[nv]); swap(fac[v], fac[nv]); for (auto [p, cs] : fac[nv]) { auto [c, s] = cs; if (!fac[v].count(p)) { dp[v] *= s; fac[v][p] = {c, s}; } else if (fac[v][p].first < c) { dp[v] /= fac[v][p].second; dp[v] *= s; fac[v][p] = {c, s}; } } fac[nv].clear(); } } ans[v] = dp[v]; } void _main() { vector prime(1000001, true); vector p; prime[0] = prime[1] = false; for (i64 i = 2; i < prime.size(); i++) { if (!prime[i]) continue; p.push_back(i); for (i64 j = i * 2; j < prime.size(); j += i) prime[j] = false; } cin >> n; for (i64 i = 0; i < n; i++) { cin >> a[i]; i64 x = a[i]; for (i64 j = 0; j < p.size(); j++) { if (p[j] * p[j] > x) break; i64 c = 0, s = 1; while (x % p[j] == 0) x /= p[j], c++, s *= p[j]; // if (c > 0) fac[i].push_back({j, c}); if (c > 0) fac[i][p[j]] = {c, s}; } i64 j = lower_bound(p.begin(), p.end(), x) - p.begin(); // fac[i].push_back({j, 1}); fac[i][x] = {1, x}; } for (i64 i = 0; i < n - 1; i++) { i64 u, v; cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); } dfs(0, -1); for (i64 i = 0; i < n; i++) { cout << ans[i].val() << "\n"; } }