Cod sursa(job #183487)

Utilizator DorinOltean Dorin Dorin Data 22 aprilie 2008 11:40:54
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 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;
int b[MAX],prim[MAX];
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;
    }
    long long q=n;
    ret = (q*(q-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)
            {
                long long q = b[k];
                if(n%2)
                    res += (q*(q-1))/2;
                else
                    res -= (q*(q-1))/2;
            }
        }
    }
       
    printf("%lld",ret-res);   
       
    return 0;
}