Cod sursa(job #1774431)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 8 octombrie 2016 22:29:53
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<bits/stdc++.h>
#define MaxVal 1000005
#define dim 1000000
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;
char buff[dim+5];
int poz=0;
void citeste(int &numar)
{
    numar=0;
    while(buff[poz]<'0' || buff[poz]>'9')
    {
        poz++;
        if(poz==dim)
        {
            poz=0;
            fread(buff,1,dim,stdin);
        }
    }
    while(buff[poz]>='0' && buff[poz]<='9')
    {
        numar=numar*10+buff[poz]-'0';
         poz++;
        if(poz==dim)
        {
            poz=0;
            fread(buff,1,dim,stdin);
        }
    }
}
inline int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
  //  scanf("%d",&n);
    fread(buff,1,dim,stdin);
    citeste(n);
    for(int i=1;i<=n;i++)
    {
      citeste(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]=1;
            }
        }
    }
    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;
}