Cod sursa(job #162684)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 20 martie 2008 15:11:38
Problema Pairs Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
#include<math.h>
long n,max,prim;
long a[100002],i,j,ok,p,aux,nr,fact,sirprim[1002];
long long cs;
long v[1000002],contor;
long frcv[1000002];
int main()
{
   freopen("pairs.in","r",stdin);
   freopen("pairs.out","w",stdout);
   scanf("%ld",&n);
   for(i=1;i<=n;i++)
   {
    scanf("%ld",&a[i]);
    frcv[a[i]]=1;
    if (a[i]>max)
     max=a[i];
   }
   for(i=2;i<=max;i++)
   {
    for(j=i;j<=max;j+=i)
      if (frcv[j]) v[i]++;
   }
  for(i=2;i<=1002;i++)
   {
    aux=i;
    ok=1;
    for(j=2;j<=sqrt(aux);j++)
     if (aux%j==0) ok=0;
   if (ok) sirprim[++sirprim[0]]=i;
   }
  for(p=2;p<=max;p++)
   if (v[p]>1)
   {
     aux=p;
     nr=0;
      fact=0;
      while(aux!=1)
         {
         fact++;
         contor=0;
         if (fact>sirprim[0]) {nr++;break;}
         while (aux%sirprim[fact]==0) {aux/=sirprim[fact];contor++;}
         if (contor==1) nr++;
                   else
                    if (contor>1) {nr=-1;break;}
         if (sirprim[fact]*sirprim[fact]>aux&&aux!=1) {nr++;break;}
         }
     if (nr!=-1)
      if (nr%2) cs+=(long long) (v[p]*(v[p]-1))/2;
           else cs-=(long long) (v[p]*(v[p]-1))/2;
   }
   printf("%ld",(long long) (n*(n-1)/2)-cs);
   return 0;
}