結果
| 問題 | No.3250 最小公倍数 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2025-08-04 01:09:58 | 
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                RE
                                 
                            (最新) 
                                AC
                                 
                            (最初) | 
| 実行時間 | - | 
| コード長 | 3,430 bytes | 
| コンパイル時間 | 2,898 ms | 
| コンパイル使用メモリ | 240,472 KB | 
| 実行使用メモリ | 45,964 KB | 
| 最終ジャッジ日時 | 2025-10-16 16:06:58 | 
| 合計ジャッジ時間 | 15,240 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 13 RE * 9 | 
ソースコード
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("Ofast")
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
#define per(i, l, r) for (int i = (r); i >= (l); --i)
#define pr pair<int, int>
#define fi first
#define se second
#define pb push_back
#define aint(x) (x).begin(), (x).end()
#define bg(x) (x).begin()
#define ed(x) (x).end()
#define sz(x) (int)(x).size()
#define N 200005
#define M 22
#define int long long
const int mod = 998244353;
int n, a[N], ans[N], siz[N], son[N], fa[N];
int iv[N], cnt[N];
int now = 1;
vector<int> e[N], g[N], c[N];
bitset<N> f, tmp;
inline int qpow(int a, int b) {
    int ans = 1;
    while (b) {
        if (b & 1) {
            ans = ans * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
inline void dfs0(int k, int f) {
    siz[k] = 1;
    fa[k] = f;
    for (int x : e[k]) {
        if (x == f) {
            continue;
        }
        dfs0(x, k);
        siz[k] += siz[x];
        if (siz[x] > siz[son[k]]) {
            son[k] = x;
        }
    }
}
inline void edit(int k, int d) {
    int len = sz(g[k]);
    rep(i, 0, len - 1) {
        int x = g[k][i], y = c[k][i];
        if (d == -1) {
            cnt[x] = 0;
            continue;
        }
        if (y > cnt[x]) {
            now = now * qpow(x, y - cnt[x]) % mod;
            cnt[x] = y;
        }
    }
}
inline void add(int k, int d) {
    edit(a[k], d);
    for (int x : e[k]) {
        if (x == fa[k]) {
            continue;
        }
        add(x, d);
    }
}
inline void calc(int k, bool r) {
    for (int x : e[k]) {
        if (x == fa[k] || x == son[k]) {
            continue;
        }
        calc(x, 0);
    }
    if (son[k]) {
        calc(son[k], 1);
    }
    edit(a[k], 1);
    for (int x : e[k]) {
        if (x == fa[k] || x == son[k]) {
            continue;
        }
        add(x, 1);
    }
    ans[k] = now;
    if (!r) {
        add(k, -1);
        now = 1;
    }
}
inline void ndiv(int k) {
    int res = k;
    c[k].resize(sz(g[k]));
    rep(i, 0, sz(g[k]) - 1) {
        int x = g[k][i];
        c[k][i] = 0;
        while (res % x == 0) {
            res /= x;
            c[k][i]++;
        }
    }
    // cout<<"div "<<k<<":\n";
    // rep(i,0,sz(g[k])-1){
    //     cout<<g[k][i]<<' '<<c[k][i]<<"\n";
    // }
    // cout<<"\n";
}
inline void init(int lim) {
    f[1] = 1;
    rep(i, 2, lim) {
        if (f[i]) {
            continue;
        }
        if (tmp[i]) {
            g[i].pb(i);
        }
        if (tmp[i]) {
            g[i].pb(i);
        }
        rep(j, 2, lim) {
            if (i * j > lim) {
                break;
            }
            f[i * j] = 1;
            if (tmp[i * j]) {
                g[i * j].pb(i);
            }
        }
    }
    rep(i, 1, n) {
        if (!tmp[a[i]]) {
            continue;
        }
        tmp[a[i]] = 0;
        ndiv(a[i]);
    }
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    rep(i, 1, n) {
        cin >> a[i];
        tmp[a[i]] = 1;
    }
    init(*max_element(a + 1, a + 1 + n));
    rep(i, 1, n - 1) {
        int u, v;
        cin >> u >> v;
        e[u].pb(v);
        e[v].pb(u);
    }
    dfs0(1, 0);
    calc(1, 1);
    rep(i, 1, n) { cout << ans[i] << '\n'; }
    return 0;
}
            
            
            
        