Cod sursa(job #3219878)

Utilizator gianiferSpita Alexandru-Mihai gianifer Data 1 aprilie 2024 17:54:31
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("pairs.in");

ofstream fout("pairs.out");

bool da[1000001];

bool ciur[1000001];
vector<int> primi;
long long multiplii[1000001];
long long int n;
int x;
int maxim = 0;
int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)
    {
        fin >> x;
        da[x] = 1;
        maxim = max(maxim, x);
    }
    for (int i = 2; i <= maxim / i; i++)
    {
        if (!ciur[i])
        {
            primi.push_back(i);
            for (int j = i * i; j <= maxim / j; j += i)
                ciur[j] = true;
        }
    }
    for (int i = 2; i <= maxim; i++)
    {
        for (int j = i; j <= maxim; j += i)
        {
            if (da[j])
                multiplii[i]++;
        }
    }
    long long rez = 0;
    for (int i = 2; i <= maxim; i++)
    {
        if (multiplii[i] > 1)
        {
            int sclav = i;
            int sclav_cnt = 0;
            int sclav_numar = 0;
            bool sclav_verificare = true;
            while (sclav != 1)
            {
                int sclav_putere = 0;
                while (sclav % primi[sclav_cnt] == 0)
                {
                    sclav /= primi[sclav_cnt];
                    sclav_putere++;
                }
                if (sclav_putere > 1)
                {
                    sclav_verificare = false;
                    break;
                }
                if (sclav_putere == 1)
                    sclav_numar++;
                if (++sclav_cnt == primi.size())
                {
                    break;
                }
            }

            if (sclav != 1)
                sclav_numar++;
            if (sclav_verificare)
            {
                if (sclav_numar % 2)
                    rez += multiplii[i] * (multiplii[i] - 1) / 2;
                else
                    rez -= multiplii[i] * (multiplii[i] - 1) / 2;
            }
        }
    }
    fout << n * (n - 1) / 2 - rez;
}