Cod sursa(job #119724)

Utilizator crawlerPuni Andrei Paul crawler Data 2 ianuarie 2008 23:30:58
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <math.h>

#define Nmax 1000024

bool a[Nmax];
int x[Nmax], q[Nmax];;

int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    
    int n,w,max=0,k;
    
    scanf("%d", &n);
    
    for (int i=1;i<=n;++i)
    {
        scanf("%d", &w);
        a[w]=1;  
        if(w>max) max = w;  
    }
    
      
    long long ret,W;
    
    ret = n-1;
    ret *= n;
    ret /= 2;
    
    for (int i=2;i<=max;++i)
    if (q[i] == 0)
    {
        q[i] = 1;
        for (int j=1;i*j<=max;++j)
         ++q[i*j];
        W=i;W*=i;
        if (W<=max) w=W;
        for (int j=1;w*j<=max;++j)
         q[w*j]=-1;
    }   
     
    for (int i=2;i<=max;++i) if (q[i]>=0)
    {
       for (int j=1;i*j<=max;++j)
        if (a[i*j]) ++x[i];                  
       W = x[i] - 1;
       W *= x[i];
       W /= 2;
       if (q[i]&1) ret += W; else ret -= W;        
    }    
     
    printf("%lld\n", ret);  
    
    return 0;    
}