Submission #1138088

#TimeUsernameProblemLanguageResultExecution timeMemory
1138088phamducminhSirni (COCI17_sirni)C++20
140 / 140
4247 ms577236 KiB
#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <stack>
#include <algorithm>
#include <string>
#include <queue>
#include <cctype>
#include <cstring>
#include <iomanip>
#include <deque>
#include <random>
#include <sstream>

// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt")
// #pragma GCC optimize("Ofast","inline","no-stack-protector")
// #pragma GCC target("arch=skylake")

using namespace std;

#define file(name) freopen(name".inp","r",stdin);\
                    freopen(name".out","w",stdout);
#define TIME (1.0*clock()/CLOCKS_PER_SEC)
#define all(a) a.begin(),a.end()
#define all1(a) a+1,a+n+1
#define ll long long

const long long INF=1e18;
const long long MOD=1e9+7;
const long long MODD[] = {(long long)998244353,(long long)1e9+2277, (long long)1e9+5277}; // 998244353
const int maxN=2e5+9;
const long long LOG=19;
const double eps = 1e-1;


//------------------------



void solve();
signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);


    // file("PNUM");



    int t;

    // cin >> t;

    t=1;

    while (t--){
        solve();
    }

    cerr << "Time: " << TIME << "s.\n";
    cerr << "ducminh";
    return 0;
}

/// -------------- PROBLEM SOLUION --------------------



int n;
int ans=0, ans1=0, mx=0;




// canh dscanh[10000009];
vector<pair<int,int>> dscanh[10000009];
int truoc[10000009];
// vector<int> b;



void init(int n){
    for(int i=1; i<=n; i++){
        truoc[i] = i;
    }
}

int root(int u){
    if (truoc[u]==u) return u;
    return truoc[u]=root(truoc[u]);
}


bool hop(int x, int y){
    int u=root(x), v=root(y);

    if (u==v) return false;
    truoc[v]=u;

    return true;
}




void solve(){  

    cin >> n;
    set<int> b;
    for (int i=1; i<=n; i++){
        int x;
        cin >> x;
        b.insert(x);
        mx=max(mx,x);
    }



    // sort(all(b));
    // b.resize(unique(all(b)) - b.begin());
 
    // for(int i=0; i<b.size(); i++)
    //     a[i+1] = b[i];
    n=b.size();
    
    if (n == 1) return cout << 0, void();
    // if (a[1] == 1) return cout << 0, void();
    


    // sort(a+1,a+n+1);

    // for (int i=2; i<=n; i++){
    //     ans+=min(a[1]%a[i], a[i]%a[1]);
    // }

    // if (n>1000) return cout << 0, void();


    int ti=0;
    init(mx+1);
    for (int i: b) {
        // for (int j=i+1; j<=n; j++) {
        //     int w = a[j] % a[i];
        //     dscanh.push_back({i, j, w});
        // }

        auto it=b.upper_bound(i);

        if (it == b.end()) continue;
        dscanh[*it-i].push_back({i,*it});

        for (int m=2*i; m<=mx; m+=i){
            auto it=b.lower_bound(m);

            // if (it>n || it<1) continue;
            // if (m==a[i] && a[it]==a[i]) it++;
            // if (it>n || it<1) continue;

            if (it == b.end()) continue;

            // dscanh.push_back({i, it, a[it]-m});
            // dscanh[ti++]={i,it,a[it]-m};
            dscanh[*it%i].push_back({i,*it});
            m = *it / i * i;
        }
    }



    // sort(dscanh, dscanh+ti, cmp);

    int d1=0;
    for (int i=0; i<=mx; i++){

        for (pair<int,int> tmp: dscanh[i]) {
            if (hop(tmp.first, tmp.second)){
                ans1 += i;
                d1++;
                if (d1==n-1) break;
            }
        }
    }






    cout << ans1;

}

    







#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...