Cod sursa(job #473873)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 1 august 2010 13:02:08
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>

#define ll long long
#define maxim(a,b) (a>b ? a : b)

ll sol,h;
int vmax,v[100005],nrp[1000006],n;
char f[1000006],valid[1000006],ciur[1000006];

int main ()
{
    int i,j;
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        f[v[i]]=1;
        vmax=maxim(vmax,v[i]);
    }
    for(i=2;i<=vmax;i++)
        valid[i]=1;
    for(i=2;i<=vmax;i++)
    {
        if(ciur[i])
            continue;
        for(j=i;j<=vmax;j+=i)
        {
            nrp[j]++;
            ciur[j]=1;
            if((j/i)%i==0)
                valid[j]=0;                
        }
    }
    sol=(ll)n*(n-1)/2;
    for(i=2;i<=vmax;i++)
        if(valid[i])
        {
            h=0;
            for(j=i;j<=vmax;j+=i)
                if(f[j])
                    h++;
            if(nrp[i]&1)
                sol-=(ll)h*(h-1)/2;
            else
                sol+=(ll)h*(h-1)/2;
        }
    printf("%lld\n",sol);
    return 0;
}