Cod sursa(job #3297778)

Utilizator Lex._.Lexi Guiman Lex._. Data 23 mai 2025 19:21:03
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <bits/stdc++.h>
#define VMAX 1000001
#define NMAX 100001
#define DIV 7
using namespace std;

int n;
int m[NMAX]; ///multimea citita
bitset<VMAX> apare;

int cautare_binara(int x)
{
    int st=1, dr=n, poz=0;
    while(st<=dr)
    {
        int mij=st+(dr-st)/2;
        if(m[mij]>=x)
        {
            dr=mij-1;
            poz=mij;
        }
        else
        {
            st=mij+1;
        }
    }
    return poz;
}

int nr_div[NMAX]; ///numarul de divizori primi ai elementelor din matrice
int lista_div[NMAX][DIV]; ///lista divizorilor elementelor din matrice

int produs_div[VMAX]; ///produsul divizorilor primi ai unui numar
int nr_multiplii[VMAX]; ///salvam de cate ori fiecare numar apare ca divizor al unui numar din multime

void eratostene()
{
    for(int i=1; i<VMAX; i++)
        produs_div[i]=1;

    for(int j=2; j<VMAX; j+=2)
    {
        produs_div[j]*=2;
        if(apare[j]==1) ///daca j apare in multime
        {
            int poz=cautare_binara(j);
            lista_div[poz][nr_div[poz]]=2;
            nr_div[poz]++;
        }
    }
    for(int i=3; i<VMAX; i+=2)
    {
        if(produs_div[i]==1)
        {
            for(int j=i; j<VMAX; j+=i)
            {
                produs_div[j]*=i;
                if(apare[j]==1) ///daca j apare in multime
                {
                    int poz=cautare_binara(j);
                    lista_div[poz][nr_div[poz]]=i;
                    nr_div[poz]++;
                }
            }
        }
    }
}

long long PIE()

int main()
{
    ifstream cin("pairs.in");
    ofstream cout("pairs.out");
    cin >> n;
    for(int i=1; i<=n; i++)
    {
        cin >> m[i];
        apare[m[i]]=1;
    }
    sort(m+1, m+n+1);
    eratostene();
    for(int i=1; i<VMAX; i++)
    {
        for(int j=i; j<VMAX; j+=i)
        {
            if(apare[j]==1) ///daca j apare in multime
            {
                nr_multiplii[i]++;
            }
        }
    }
    long long nr_perechi=(long long)n*(n-1)/2;
    for(int i=1; i<=n; i++)
    {
        nr_perechi-=PIE(i);
    }
    cout << nr_perechi;

    return 0;
}