Cod sursa(job #2312372)

Utilizator dragos99Homner Dragos dragos99 Data 4 ianuarie 2019 19:14:36
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<fstream>
#include<vector>
using namespace std;
    ifstream f("pairs.in");
    ofstream g("pairs.out");

vector<long long> nrprime;
long long n;
long long a[100001], x[1000001];
char exista[1000001], ciur_marcat[1000001];

void ciur(long long n)
{
    long i, j;
    for(i = 2 ; i <= n ; i++){
        if(ciur_marcat[i] == 0){
            nrprime.push_back(i);
            for(j = i + i ; j <= n ; j += i)
                ciur_marcat[j] = 1;
        }
    }
}

long long numarFactoriPrimi(long long n)
{
    long i;
    long long nrFactori = 0;
    bool ePrim = true;
    for(i = 0 ; nrprime[i] <= n / 2 ; i++){
        if(n % nrprime[i] == 0){
            ePrim = false;
            if(n % (nrprime[i] * nrprime[i]) == 0){
                return -1;
            }
            else{
                nrFactori ++;
            }
        }
    }
    if(ePrim == true)
        return 1;
    return nrFactori;
}

int main()
{
    long i, j, maxim;
    f>>n>>a[0];
    maxim = a[0];
    exista[a[0]] = 1;
    for(i = 1 ; i < n ; i++){
        f>>a[i];
        exista[a[i]] = 1;
        if(a[i] > maxim)
            maxim = a[i];
    }

    for(i = 1 ; i <= maxim ; i++){
        for(j = 1 ; j <= maxim / i ; j++){
            if(exista[i * j]){
                x[i] ++;
            }
        }
    }

    ciur(1000);

    long long sol = ( n * (n - 1) ) / 2;
    for(i = 2 ; i <= maxim ; i++){
        if(x[i]){
            long long p = numarFactoriPrimi(i);
            if(p > 0){
                if(p % 2 == 0){
                    sol += (x[i] * (x[i] - 1)) / 2;
                }
                else{
                    sol -= (x[i] * (x[i] - 1)) / 2;
                }
            }
        }
    }

    g<<sol;

    return 0;
}