Cod sursa(job #3286218)

Utilizator rapidu36Victor Manz rapidu36 Data 13 martie 2025 20:32:48
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

const int VMAX = 1e6;
const int NDP = 1;

bitset <VMAX + 1> in_M;
bitset <VMAX + 1> c;
int nr_mult[VMAX+1];
vector <int> prime, multime;


void ciur()
{
    for (int i = 2; i <= VMAX; i++)
    {
        for (int mult = i; mult <= VMAX; mult += i)
        {
            if (in_M[mult])
            {
                nr_mult[i]++;
            }
        }

        if (!c[i] && (long long)i * i <= VMAX)
        {
            prime.push_back(i);
            for (int mult = i * i; mult <= VMAX; mult += i)
            {
                c[mult] = 1;
            }
        }
    }
}

void descompune(int n, vector <int> &dp)
{
    int i = 0;
    while (i < (int)prime.size() && prime[i] * prime[i] <= n)
    {
        if (n % prime[i] == 0)
        {
            dp.push_back(prime[i]);
            while (n % prime[i] == 0)
            {
                n /= prime[i];
            }
        }
        i++;
    }
    if (n != 1)
    {
        dp.push_back(n);
    }
}

int main()
{
    ifstream in("pairs.in");
    ofstream out("pairs.out");
    int n;
    in >> n;
    multime.resize(n);
    for (int i = 0; i < n; i++)
    {
        in >> multime[i];
        in_M[multime[i]] = 1;
    }
    ciur();
    long long nr_perechi = 0;
    for (auto m: multime)
    {
        vector <int> div_primi;
        div_primi.clear();
        descompune(m, div_primi);
        int ndp = div_primi.size();
        //out << m << ": ";
        nr_perechi += n;
        for (int i = 1; i < (1 << ndp); i++)
        {
            int divizor = 1, nrdiv = 0;
            for (int j = 0; j < ndp; j++)
            {
                if (i & (1 << j))
                {
                    divizor *= div_primi[j];
                    nrdiv++;
                }
            }
            if (nrdiv % 2 == 0)
            {
                nr_perechi += nr_mult[divizor];
            }
            else
            {
                nr_perechi -= nr_mult[divizor];
            }
            //out << divizor << " ";
        }
        //out << nr_perechi << "\n";
    }
    out << nr_perechi / 2 << "\n";
    in.close();
    out.close();
    return 0;
}