Cod sursa(job #290278)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 27 martie 2009 18:38:22
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>   
#define DIM 1000005   
#define ll long long   
int c[DIM],p[DIM];   
bool ap[DIM];   
int n,max;   
ll rez;   
void read ()   
{   
    int i,nr;   
    scanf ("%d",&n);   
    for (i=1; i<=n; ++i)   
    {   
        scanf ("%d",&nr);   
        ap[nr]=1;   
        if (nr>max)   
            max=nr;   
    }   
}   
void solve ()   
{   
    int i,j;   
    for (i=2; i<=max; ++i)   
        for (j=i; j<=max; j+=i)   
            c[i]+=ap[j];   
    for (i=2; i<=max; ++i)   
        if (!p[i])   
            for (j=2*i; j<=max; j+=i)   
                if (p[j]!=-1 && j%(i*i))       
                    ++p[j];   
                else   
                    p[j]=-1;   
    rez=(ll)n*(n-1)/2;   
    for (i=2; i<=max; ++i)   
        if (p[i]>=0)   
        {   
            if (!p[i])   
                p[i]=1;   
            if (p[i]%2)   
                rez-=(ll)c[i]*(c[i]-1)/2;   
            else   
                rez+=(ll)c[i]*(c[i]-1)/2;   
        }   
    printf ("%lld",rez);   
}   
int main ()   
{   
    freopen ("pairs.in","r",stdin);   
    freopen ("pairs.out","w",stdout);       
    read ();   
    solve ();   
    return 0;   
}