Cod sursa(job #3125955)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 4 mai 2023 20:55:15
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("pairs.in");
ofstream out("pairs.out");

int n,a[100005],fr[1000005];
bool sieve[1000005];
int mobius[1000005];
vector<int>primes;

void prec()
{
    for (int i = 2; i <= 1000000; i++)
        if (!sieve[i])
            for (int j = 2 * i; j <= 1000000; j += i)
                sieve[j] = true;
    for (int i = 2; i <= 1000000; i++)
        if (!sieve[i])
            primes.push_back(i);
    for (int i = 1; i <= 1000000; i++)
        mobius[i] = -1;
    for (int i = 0; i < primes.size(); i++)
        for (int j = primes[i]; j <= 1000000; j += primes[i])
            mobius[j] = -mobius[j];
    for (int i = 0; primes[i] * primes[i] <= 1000000; i++)
        for (int j = primes[i] * primes[i]; j <= 1000000; j += primes[i] * primes[i])
            mobius[j] = 0;
}

int main()
{
    prec();
    in >> n;
    for (int i = 1; i <= n; i++)
        in >> a[i],fr[a[i]]++;
    long long ans = 0;
    for (int i = 1; i <= 1000000; i++)
    {
        int cate = 0;
        for (int j = i; j <= 1000000; j += i)
            cate += fr[j];
        ans += 1ll * cate * (cate - 1) / 2ll * mobius[i];
    }
    out << -ans;
    return 0;
}
/**
perechea (a b) o numar la d | gcd(a,b) astfel:
la un factor prim cu +
la doi factori primi cu -
...
daca nu e liber de patrate cu 0
i.e cu mobius[d]
**/