#include <bits/stdc++.h>
using namespace std;
struct Edge{
int u, v, w;
Edge() {}
Edge(int u, int v, int w) : u(u), v(v), w(w) {}
bool operator < (const Edge& other) const {
return w < other.w;
}
};
const int MAXN=1e5;
const int MAXP=1e7;
int n, nxt[MAXP+5], par[MAXN+5];
vector<int> p;
vector<Edge> edges;
void build(){
for(int i=0; i<n; i++) par[i]=i;
}
int find(int u){
if (u == par[u]) return u;
return par[u]=find(par[u]);
}
bool dsu(int u, int v) {
u=find(u);
v=find(v);
if(u==v) return false;
par[v]=u;
return true;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n;
for(int i=0, x; i<n; i++){
cin>>x;
p.push_back(x);
}
sort(p.begin(), p.end());
p.erase(unique(p.begin(), p.end()), p.end());
n=p.size();
for(int i=0; i<n-1; i++){
nxt[p[i]]=i;
for(int j=p[i]+1; j<p[i+1]; j++){
nxt[j]=i+1;
}
}
nxt[p[n-1]]=n-1;
for(int i=0; i<n; i++){
edges.emplace_back(i, nxt[p[i]+1], p[nxt[p[i]+1]]%p[i]);
for(int k=2*p[i]; k<=p[n-1]; k+=p[i]){
edges.emplace_back(i, nxt[k], p[nxt[k]]%p[i]);
k=p[nxt[k]]/p[i]*p[i];
}
}
sort(edges.begin(), edges.end());
build();
int ans=0;
for(auto& c:edges) {
if(dsu(c.u, c.v)){
ans+=c.w;
}
}
cout<<ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |