結果
問題 |
No.3250 最小公倍数
|
ユーザー |
|
提出日時 | 2025-08-29 23:01:31 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,366 bytes |
コンパイル時間 | 3,910 ms |
コンパイル使用メモリ | 287,376 KB |
実行使用メモリ | 813,704 KB |
最終ジャッジ日時 | 2025-08-29 23:01:38 |
合計ジャッジ時間 | 7,182 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 4 MLE * 1 -- * 16 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MOD = 998244353; int N; vector<int> A; vector<vector<int>> G; vector<int> primes; vector<vector<int>> ans; // ans[v][p_index] = 指数 // エラトステネスで素数リストを作る vector<int> sieve(int n) { vector<bool> 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<int> ps; for (int i = 2; i <= n; i++) if (is_prime[i]) ps.push_back(i); return ps; } // 素因数分解 vector<int> factorize(int x, const vector<int>& primes) { vector<int> 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<int>(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"; } }