Cod sursa(job #2310127)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 30 decembrie 2018 17:05:39
Problema Pairs Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<fstream>
using namespace std;
ifstream cin("pairs.in");
ofstream cout("pairs.out");
int n,x,Prez[1000005],Maxim;
long long Total,Rez;
int main(){

    std::ios_base::sync_with_stdio(false);

    cin>>n;

    for(int i=1;i<=n;i++){

        cin>>x;
        Maxim=max(x,Maxim);
        Prez[x]++;

    }

    int NrEl[Maxim+5]={0},PrDesc[Maxim+5]={0},PrUnic[Maxim+5]={0},NrP[Maxim+5]={0},k=0;

    for(int i=2;i<=Maxim;i+=2){

        PrDesc[i]++;
        PrUnic[i]=i/2;
        if(PrUnic[i]==1) NrP[++k]=i;

    }

    for(int i=3;i<=Maxim;i+=2)
        PrUnic[i]=i;

    for(int i=3;i<=Maxim;i+=2)
        if(PrDesc[i]==0)
            for(int j=i;j<=Maxim;j+=i){

                PrDesc[j]++;
                PrUnic[j]/=i;
                if(PrUnic[j]==1) NrP[++k]=j;

            }

    for(int i=1;i<=k;i++)
            for(int j=NrP[i];j<=Maxim;j+=NrP[i])
                 NrEl[NrP[i]]+=Prez[j];

    Total=1LL*n*(n-1)/2;

    for(int i=1;i<=k;i++)

            if(PrDesc[NrP[i]]%2==0)
                Rez-=1LL*NrEl[NrP[i]]*(NrEl[NrP[i]]-1)/2;

            else
                Rez+=1LL*NrEl[NrP[i]]*(NrEl[NrP[i]]-1)/2;

    cout<<Total-Rez;

}