Cod sursa(job #2376870)

Utilizator mirunazMiruna Zavelca mirunaz Data 8 martie 2019 18:17:21
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

int main() {
    ifstream cin("pairs.in");
    ofstream cout("pairs.out");
    
    int m = 1e6;
    
    vector<int> mu(m + 1, 1), lo(m + 1, 0), cnt(m + 1, 0);
    for (int d = 2; d * d <= m; ++d) {
        if (lo[d]) continue;
        for (int i = d * d; i <= m; i += d)
            lo[i] = d;
    }
    
    int n; cin >> n;
    for (int i = 0; i < n; ++i) {
        int x; cin >> x;
        vector<int> divs;
        
        while (x > 1) {
            int p = lo[x] ?: x;
            divs.push_back(p);
            while (x % p == 0)
                x /= p;
        }
        
        for (int msk = 0; msk < (1 << divs.size()); ++msk) {
            int now = 1, m = 1;
            for (int i = 0; i < (int)divs.size(); ++i) {
                if (msk & (1 << i)) {
                    now *= divs[i];
                    m = -m;
                }
            }
            cnt[now] += 1;
            mu[now] = m;
        }
    }
    
    long long ans = 0;
    for (int d = 1; d <= m; ++d) {
        if (mu[d])
            ans += 1LL * mu[d] * cnt[d] * (cnt[d] - 1) / 2;
    }
    cout << ans << endl;
    
    return 0;
}