Cod sursa(job #2735383)

Utilizator vansJos da pa perete vans Data 2 aprilie 2021 12:28:17
Problema Pairs Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NRMAX = 1e6 - 1;

int n, x, M, fr[NRMAX + 1], nrdivpr[NRMAX + 1];
bool bad[NRMAX + 1];

int main()
{
    freopen("pairs.in", "r", stdin);
    freopen("pairs.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &x), ++fr[x], M = max(M, x);
    long long ans = n * (n - 1) / 2;
    for(int i = 2; i <= M; ++i)
        if(!bad[i]) {
            long long crt = 0;
            bool isPr = !nrdivpr[i];
            for(int j = i; j <= M; j += i) {
                if(isPr) {
                    ++nrdivpr[j];
                    if(j % (i * i) == 0) bad[j] = 1;
                }
                crt += fr[j];
            }
            if(nrdivpr[i] % 2) ans -= crt * (crt - 1) / 2;
            else ans += crt * (crt - 1) / 2;
        }
    printf("%lld", ans);
    return 0;
}