Cod sursa(job #2261418)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 16 octombrie 2018 10:58:22
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#define DIM 100005
#define DIMC 1000005

using namespace std;

ifstream in ("pairs.in");
ofstream out("pairs.out");

int maxim = -1;
int ciur[DIMC + 10];

int viz[DIMC + 10];

long long notPrime, n;

void CalcCiur(){
    for(int i = 2; i <= DIMC; ++ i){
        if(!ciur[i]){
            ciur[i] = 1;
            for(int j = i + i; j <= DIMC; j += i){
                ++ ciur[j];
            }
        }
    }

    for(int i = 2; i * i <= DIMC; ++ i){
        for(int j = i * i; j <= DIMC; j += i * i)
            ciur[j] = 0;
    }
}

int main()
{
    in>>n;
    int x = 0;
    for(int i = 1; i <= n; ++ i){
        in>>x;
        viz[x] = 1;
        maxim = max(x, maxim);
    }
    CalcCiur();
    long long Prime = (long long)n * (n - 1) / 2;
    long long nr = 0;
    for(int i = 2; i <= DIMC; ++ i){
        if(ciur[i] > 0){
            nr = 0;
            for(int j = i; j <= DIMC; j += i)
                nr += viz[j];

            if(ciur[i] % 2){
                Prime -= (long long)nr * (nr - 1) / (2);
            }
            else{
                Prime += (long long)nr * (nr - 1) / (2);
            }
        }

    }
    out<<Prime;
    return 0;
}