結果
問題 | No.1917 LCMST |
ユーザー |
![]() |
提出日時 | 2022-04-29 22:03:45 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 354 ms / 4,000 ms |
コード長 | 1,213 bytes |
コンパイル時間 | 4,623 ms |
コンパイル使用メモリ | 260,864 KB |
最終ジャッジ日時 | 2025-01-28 22:53:38 |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 42 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:17:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 17 | scanf("%d",&A); | ~~~~~^~~~~~~~~
ソースコード
#include <stdio.h> #include <atcoder/all> #include <bits/stdc++.h> using namespace std; using namespace atcoder; using mint = modint1000000007; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000000 int main(){ int N; cin>>N; vector<int> cnt(100001,0); rep(i,N){ int A; scanf("%d",&A); cnt[A]++; } long long ans = 0; rep(i,cnt.size()){ if(cnt[i]>1){ long long t = cnt[i]-1; t *= i; ans += t; } } vector ds(100001,vector<int>()); for(int i=1;i<=100000;i++){ for(int j=i*2;j<=100000;j+=i){ ds[j].push_back(i); } } vector<long long> mini(100001,Inf); for(int i=1;i<=100000;i++){ for(int j=i;j<=100000;j+=i){ if(cnt[j]>0){ mini[i] = j; break; } } } dsu D(100001); vector<pair<long long,pair<int,int>>> E; rep(i,cnt.size()){ if(cnt[i]>0){ rep(j,ds[i].size()){ int t = ds[i][j]; if(mini[t]==Inf)continue; E.emplace_back(lcm(mini[t],i),make_pair(mini[t],i)); } } } sort(E.begin(),E.end()); //cout<<ans<<endl; rep(i,E.size()){ long long Dc = E[i].first; int u = E[i].second.first; int v = E[i].second.second; if(D.same(u,v))continue; D.merge(u,v); ans += Dc; } cout<<ans<<endl; return 0; }