Cod sursa(job #3292196)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 7 aprilie 2025 13:07:34
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

const long long M_MAX = 1e6 + 5, MAX_PRIME = 1e3 + 10;

void SetInput(string name)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    (void)!freopen((name + ".in").c_str(), "r", stdin);
    (void)!freopen((name + ".out").c_str(), "w", stdout);
}

int fr[M_MAX];

int lp[M_MAX];
vector<int> primes;
int mob[M_MAX];

int CalcMob(int x)
{
    int cnt = 0;
    while(x != 1)
    {
        int p = lp[x];
        cnt++;

        x /= p;
        if(x % p == 0)
            return 0;
    }
    if(cnt % 2 == 1)
        return -1;
    else
        return 1;
}

void PrecalcMobius()
{
    mob[1] = 1;
    for(int i = 2; i < M_MAX; i++)
    {
        if(lp[i] == 0)
        {
            lp[i] = i;
            primes.push_back(i);
        }

        for(unsigned int j = 0; j < primes.size() && i * primes[j] < M_MAX && primes[j] <= lp[i]; j++)
            lp[i * primes[j]] = primes[j];

        mob[i] = CalcMob(i);
    }
}

inline long long Comb2(const int& n)
{
    return 1LL * n * (n - 1) / 2;
}

void Solve()
{
    int N, M = 0;
    cin >> N;

    for(int i = 1, x; i <= N; i++)
    {
        cin >> x;
        M = max(M, x);
        fr[x] = 1;
    }

    long long sol = Comb2(N);

    for(int i = 2; i <= M; i++)
        if(mob[i] != 0)
        {
            int multiples = 0;

            for(int j = i; j <= M; j += i)
                multiples += fr[j];

            long long pairs = Comb2(multiples);

            sol += mob[i] * pairs;
        }

    cout << sol << '\n';
}

int main()
{
    SetInput("pairs");

    PrecalcMobius();
    Solve();

    return 0;
}