Cod sursa(job #150869)

Utilizator DorinOltean Dorin Dorin Data 7 martie 2008 15:40:01
Problema Pairs Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
# include <stdio.h>

# define input "pairs.in"
# define output "pairs.out"

# define MAX 1000001

bool a[MAX],u[MAX];
int n,i,j,x,m,k,aux,nr;
long long b[MAX],prim[78499];
long long res,ret;

int main()
{
    freopen(input, "r", stdin);
    freopen(output, "w", stdout);
    
    scanf("%d",&n);
    
    for(i=1;i<=n;i++)
    {
       scanf("%d",&x);
       a[x] = 1;
       if( x > m ) 
          m = x;
    }

    ret = (long long)(n*(n-1)/2);
    for(i=2;i<=m;i++)
    {
       for(j=1;j*i<=m;j++)
          b[i] += a[j*i];

    }
    
    
    prim[1] = 2;
    nr = 1;
    
    for(i=3;i<=m;i+=2)
       if(!u[i])
       {
           prim[++nr] = i;
           for(j=i+i;j<=m;j+=i)
               u[j] = true; 
       }


    for(k=2;k<=m;k++)
    {
        if(b[k] >= 2)
        {
        aux = k;
        n = 1;
        bool ok = true;
        for(j=1;prim[j]*prim[j] <= aux;j++)
        {
           if(aux%prim[j] == 0)
           {
              n++;
              aux/=prim[j];
           }
           if(aux%prim[j] == 0)
           {  ok = false;
           break;    }
        }
        if(ok)
        {
         if(n%2)
           res += b[k]*(b[k]-1)/2;
         else
             res -= b[k]*(b[k]-1)/2;
         }
         }
    }
       
    printf("%lld",ret-res);   
       
    return 0;
}