Cod sursa(job #274941)

Utilizator DraStiKDragos Oprica DraStiK Data 10 martie 2009 08:58:42
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 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;
}