Cod sursa(job #1774422)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 8 octombrie 2016 22:22:26
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<bits/stdc++.h>
#define MaxVal 1000005
using namespace std;
int n,maxim,x,seen[MaxVal],prime[MaxVal>>1],dp,j,nr,e,l,X[MaxVal],Y[MaxVal],k;
long long sol,perechi;
bool ciur[MaxVal];
bool ok;
int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        seen[x]=1;
        maxim=max(maxim,x);
    }
    for(int i=2;(i*i)<=maxim;i++)
    {
        if(!ciur[i])
        {
            for(int j=(i<<1);j<=maxim;j+=i)
            {
                ciur[j]=i;
            }
        }
    }
    for(int i=2;i<=maxim;i++)
    {
        if(!ciur[i])
        {
            prime[++dp]=i;
        }
    }
    for(int i=2;i<=maxim;i++)
    {
        x=i;
        j=1;
        ok=1;
        nr=0;
        while(j<=dp && x>1 && ok)
        {
            e=0;
            if(!(x%prime[j])) nr++;
            while(!(x%prime[j]))
            {
                e++;
                x/=prime[j];
            }
            if(e>1)
            {
                ok=0;
            }
            j++;
        }
        if(ok)
        {
            l++;
            X[l]=i;
            Y[l]=nr;
        }
    }
    long long sol=0;
    for(int i=1;i<=l;i++)
    {
        k=X[i];
        nr=0;
        for(int j=k;j<=maxim;j+=k)
        {
            nr=nr+seen[j];
        }
        long long perechi=(nr*(nr-1))>>1;
        if(Y[i]%2) sol=sol+perechi;
            else sol-=perechi;
    }
    sol=((n*(n-1))>>1)-sol;
    printf("%lld\n",sol);
    return 0;
}