Cod sursa(job #202154)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 6 august 2008 13:59:28
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>

#define FIN "pairs.in"
#define FOUT "pairs.out"
#define MAX 1000001

int N,max,vec_ap[MAX],nr[MAX];
char prim[MAX];
long long REZ;
int i,j,l,x;

void ciur()
{

for (i=2;i<=max;++i)
     prim[i]=1;
for (i=2;i<=max;++i)
    {
     for (j=i+i;j<=max;j+=i)
	  if (vec_ap[j]==1)
	      vec_ap[i]++;
	  if ((int)prim[i]==1)
	      {
	      nr[i]=1;
	      for (l=i+i;l<=max;l+=i)
		  {
		   prim[l]=0;
		   if ((l/i)%i!=0)
		       nr[l]++;
		    }
		}
      }
}



int maxim(int a, int b)
{

if (a>b) return a;
    else return b;
}


void read()
{

freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);

scanf("%d", &N);

max=0;

for (i=1;i<=N;++i)
     {
      scanf("%d", &x);
      max=maxim(max,x);
      vec_ap[x]++;
      }
}



void solve()
{

read();
ciur();
REZ=N*(N-1)/2;
for (i=2;i<=max;++i)
     {
      if (nr[i]%2)
	 REZ-=(long long)(vec_ap[i]*(vec_ap[i]-1)/2);
	 else
	 REZ+=(long long)(vec_ap[i]*(vec_ap[i]-1)/2);
       }
printf("%lld", REZ);
}

int main()
{
solve();
return 0;
}