Cod sursa(job #1892740)

Utilizator cipri321Marin Ciprian cipri321 Data 25 februarie 2017 11:23:07
Problema Pairs Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>

using namespace std;
FILE *fi,*fo;
int n;
int i,j;
bool F[1000001],E[1000001];
int A[100001],P[100001],k,X[1000001];
int maxv;
bool ok;
int nrd;
int rez,e,x;
int main()
{
    fi=fopen("pairs.in","r");
    fo=fopen("pairs.out","w");
    fscanf(fi,"%d",&n);
    for(i=1;i<=n;i++)
    {
        fscanf(fi,"%d",&A[i]);
        F[A[i]]++;
        if(maxv<A[i])
            maxv=A[i];
    }
    for(i=1;i<=maxv;i++)
        for(j=1;i*j<=maxv;j++)
            if(F[i*j]>0)
                X[i]++;
    for(i=1;i<=maxv;i++)
        E[i]=true;
    for(i=2;i<=maxv;i++)
        if(E[i])
        {
            P[++k]=i;
            for(j=i+i;j<=maxv;j+=i)
                E[j]=false;
        }
    for(i=2;i<=maxv;i++)
    {
        j=1,ok=true,nrd=0;
        x=i;
        while(P[j]*P[j]<=x)
        {
            e=0;
            while(x%P[j] == 0)
            {
                e++;
                x/=P[j];
            }
            if(e>1)
            {
                ok=false;
                break;
            }
            if(e==1)
                nrd++;
            j++;
        }
        if(x>1)
            nrd++;
        if(ok)
            if(nrd%2==0)
                rez-=X[i]*(X[i]-1)/2;
            else
                rez+=X[i]*(X[i]-1)/2;
    }
    fprintf(fo,"%d",n*(n-1)/2-rez);
    fclose(fi);
    fclose(fo);
    return 0;
}