Cod sursa(job #160764)

Utilizator rethosPaicu Alexandru rethos Data 16 martie 2008 19:58:48
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#define NM 1000002
int v[NM],p[200],a[NM],d[NM];
long n,max;
int main()
{freopen("pairs.in","r",stdin);
 freopen("pairs.out","w",stdout);
 scanf("%ld",&n);
 long x,i,j,k,sw,aux,mult;
 for (i=1;i<=n;i++)
    {scanf("%ld",&x);
     a[x]=1;
     if(x>max) max=x;
    }
 for (i=2;i<=max;i++)
    for (j=1;j<=max/i;j++)
       if(a[i*j]) d[i]++;
 k=1;p[1]=2;
 for (i=3;i<=1000;i++)
    {sw=1;
     j=1;
     while (p[j]*p[j]<=i)
       {if(i%p[j]==0){sw=0;break;}
        else j++;
       }
     if(sw) p[++k]=i;
    }
 long long rez=0;
 for (i=2;i<=max;i++)
    if (d[i]>1)
    {aux=i;sw=1;
     j=1;k=0;
     while(p[j]*p[j]<=aux&&sw)
       {mult=0;
        while(aux%p[j]==0)
          {mult++;
           aux/=p[j];
          }
        if(mult>1) sw=0;
        else {j++;
              if(mult==1) k++;
             }
      }
    if(sw&&aux>1) k++;
    if(sw)
      {if(k%2==0) rez-=(long long)d[i]*(d[i]-1)/2;
       else rez+=(long long)d[i]*(d[i]-1)/2;
      }
   }
 rez=(long long)n*(n-1)/2-rez;
 printf("%lld",rez);
 return 0;
}