Cod sursa(job #119671)

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

#define Nmax 1000024

bool a[Nmax], g[Nmax];
int x[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 (g[i] == 0)   
    { 
          w = i; k = 0;      
              
          for (int j=2;j<=sqrt(w);++j)
           if (w%j==0)
           {
              ++k;
              w/=j;
              if (w%j==0) k = -1;
              if (k<0) break;      
           }
          
          if (w > 1) ++k;
          
           
          if (k>0)
          {
            for (int j=1;i*j<=max;++j)
             if (a[i*j]) ++x[i];                  

            if (x[i] > 1)
            {          
              W = x[i]-1;
              W *= x[i];
              W /= 2;          
              if (k&1) ret -= W; else ret += W;          
            }  
          }
          else
          if (i<=100)
          {
            for (int j=2;i*j<=max;++j)
             g[i*j] = 1;                        
          }
    }  
     
    printf("%lld\n", ret);  
    
    return 0;    
}