Cod sursa(job #3196867)

Utilizator BurloiEmilAndreiBurloi Emil Andrei BurloiEmilAndrei Data 24 ianuarie 2024 21:47:35
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
#define int ll
#define pb push_back

const string FILE_NAME = "pairs";
const int MAX_VAL = 1e6;

int cnt[MAX_VAL + 5];
bool ciur[MAX_VAL + 5];
vector<int> primes, divisors;

signed main() {
#ifndef LOCAL
    ifstream cin(FILE_NAME + ".in");
    ofstream cout(FILE_NAME + ".out");
#endif

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, i, d, j, k, num, nr, ans;

    for (d = 2; d * d <= MAX_VAL; d++) {
        if (!ciur[d]) {
            for (i = d * d; i <= MAX_VAL; i += d) {
                ciur[i] = true;
            }
        }
    }

    for (d = 2; d <= MAX_VAL; d++) {
        if (!ciur[d]) {
            primes.pb(d);
        }
    }

    cin >> n;
    for (i = 0; i < n; i++) {
        cin >> num;

        divisors.clear();
        for (int prime : primes) {
            if (num == 1) {
                break;
            }

            if (!ciur[num]) {
                divisors.pb(num);
                break;
            }

            if (num % prime == 0) {
                divisors.pb(prime);
                while (num % prime == 0) {
                    num /= prime;
                }
            }
        }

        /* bit mask */
        for (j = 0; j < (1 << (divisors.size())); j++) {
            nr = 1;
            for (k = 0; k < divisors.size(); k++) {
                if (j & (1 << k)) {
                    nr *= divisors[k];
                }
            }

            if (__builtin_popcount(j) & 1) {
                ans -= cnt[nr];
            } else {
                ans += cnt[nr];
            }
            cnt[nr]++;
        }
    }

    cout << ans;
    return 0;
}