結果
| 問題 | No.3250 最小公倍数 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-16 18:42:16 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 1,735 ms / 2,000 ms |
| + 372µs | |
| コード長 | 3,213 bytes |
| 記録 | |
| コンパイル時間 | 5,420 ms |
| コンパイル使用メモリ | 359,756 KB |
| 実行使用メモリ | 229,304 KB |
| 最終ジャッジ日時 | 2026-10-16 18:42:59 |
| 合計ジャッジ時間 | 30,341 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 23 |
コンパイルメッセージ
main.cpp: In function 'void artidfs(ll)':
main.cpp:58:34: warning: 'loc' may be used uninitialized [-Wmaybe-uninitialized]
58 | val[node]=val[loc];
| ~~~~~~~^
main.cpp:46:18: note: 'loc' was declared here
46 | ll now=0,loc,mul=1;
| ^~~
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll biao=1e6+10,mod=998244353;
vector<ll> e[biao],v[biao];
ll dfn[biao],n,st[biao][20],d[biao],a[biao],idx,to[biao];
vector<ll> rd[biao],pri;
ll vis[biao];
ll val[biao],mx[biao];
void dfs(ll node,ll father){
d[node]=d[father]+1,st[node][0]=father,dfn[node]=++idx,to[dfn[node]]=node;
for(ll i=1;i<19;i++) st[node][i]=st[st[node][i-1]][i-1];
for(ll i=0;i<v[node].size();i++){
ll j=v[node][i];
if(j==father) continue;
dfs(j,node);
}
}
ll lca(ll x,ll y){
if(d[x]<d[y]) swap(x,y);
for(ll i=18;i>=0;i--) if(d[st[x][i]]>=d[y]) x=st[x][i];
if(x==y) return x;
for(ll i=18;i>=0;i--) if(st[x][i]!=st[y][i]) x=st[x][i],y=st[y][i];
return st[x][0];
}
bool cmp(ll x1,ll x2){return dfn[x1]<dfn[x2];}
ll s[biao];
ll ans[biao],qp[biao];
ll quickpow(ll x,ll y){
ll ret=1;
while(y){
if(y&1) ret=ret*x%mod;
x=x*x%mod,y>>=1;
}
return ret;
}
void artidfs(ll node){
// cout<<node<<'\n';
ll now=0,loc,mul=1;
for(ll i=0;i<e[node].size();i++){
ll j=e[node][i];
artidfs(j);
mul=mul*qp[j]%mod;
if(mx[j]>now) now=mx[j],loc=j;
}
if(mx[node]>now){
ans[node]=ans[node]*mul%mod*val[node]%mod;
}
else{
mx[node]=now;
val[node]=val[loc];
qp[node]=qp[loc];
ans[node]=ans[node]*mul%mod*val[loc]%mod;
}
e[node].clear();
}
void link(ll x,ll y){
val[x]=qp[x]=1,mx[x]=0;
val[y]=qp[y]=1,mx[y]=0;
e[x].push_back(y);
}
void solve(ll p){
// cout<<p<<":\n";
if(rd[p].empty()) return;
ll np=quickpow(p,mod-2);
ll sz=0;
for(ll i=0;i<rd[p].size();i++){
ll j=rd[p][i];
if(!sz){s[++sz]=j;continue;}
ll l=lca(j,s[sz]);
while(sz>=2 && d[s[sz-1]]>=d[l]) link(s[sz-1],s[sz]),sz--;
if(s[sz]!=l){
link(l,s[sz]);
sz--;
if(!sz || s[sz]!=l) s[++sz]=l;
}
s[++sz]=j;
}
ll rt=s[1];
val[rt]=qp[rt]=1,mx[rt]=0;
while(sz>=2) link(s[sz-1],s[sz]),sz--;
for(ll i=0;i<rd[p].size();i++){
ll tmp=a[rd[p][i]],j=rd[p][i];
while(tmp%p==0) mx[j]++,val[j]=val[j]*p%mod,qp[j]=qp[j]*np%mod,tmp/=p;
}
// cout<<p<<" "<<rt<<"***\n";
// for(ll i=1;i<=n;i++){
// cout<<i<<":"<<mx[i]<<" "<<val[i]<<" "<<qp[i]<<"->"<<'\n';
// for(ll j=0;j<e[i].size();j++) cout<<e[i][j]<<" ";cout<<'\n';
// }
// cout<<rt<<'\n';
artidfs(rt);
}
void query(ll node,ll father){
for(ll i=0;i<v[node].size();i++){
ll j=v[node][i];
if(j==father) continue;
query(j,node);
ans[node]=ans[node]*ans[j]%mod;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(ll i=2;i<=1e6;i++){
if(!vis[i]) pri.push_back(i);
for(ll j=0;j<pri.size();j++){
if(i*pri[j]>1e6) break;
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
cin>>n;
for(ll i=1;i<=n;i++) cin>>a[i];
for(ll i=1;i<n;i++){
ll x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,0);
for(ll i=1;i<=n;i++){
ll tmp=a[to[i]];
for(ll j=0;j<pri.size();j++){
if(pri[j]>1e3) break;
if(tmp%pri[j]) continue;
while(tmp%pri[j]==0) tmp/=pri[j];
rd[pri[j]].push_back(to[i]);
}
if(tmp!=1) rd[tmp].push_back(to[i]);
}
for(ll i=1;i<=n;i++) ans[i]=1;
for(ll i=0;i<pri.size();i++) solve(pri[i]);
// for(ll i=1;i<=n;i++) cout<<ans[i]<<'\n';
query(1,0);
for(ll i=1;i<=n;i++) cout<<ans[i]<<'\n';
return 0;
}