Cod sursa(job #539253)

Utilizator iulishorIulian Popescu iulishor Data 22 februarie 2011 19:13:51
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#include<string.h>
long n,i,a,f[1000050],x[1000050],j,max;
long long s,aa;
int main()
{
 freopen("pairs.in","r",stdin);
 freopen("pairs.out","w",stdout);
 scanf("%ld",&n);
 for(i=1;i<=n;++i)
    {
		scanf("%ld",&a);
     if(a>max)
		 max=a;
     f[a]=1;
	  //printf("%ld " ,f[i]);
 }
 /*for(i=1;i<=max;i++)
	 printf("%ld " ,f[i]);*/
//printf("\n"); 
 for(i=2;i<=max;++i)
    for(j=i;j<=max;j+=i)
       x[i]+=f[j];
 memset(f,0,sizeof(f));
 long long ii,jj;
 for(ii=2;ii<=max;++ii)
    if(f[ii]==0)
      {
		  for(jj=ii;jj<=max;jj+=ii)
          {
			  if(f[jj]>-1)
				  f[jj]++;
		  }
		/*  for(i=1;i<=max;i++)
		printf("%lld  ",f[i]);
	printf("\n");*/
       for(jj=ii*ii;jj<=max;jj+=ii*ii)
          f[jj]=-1;
	  /* for(i=1;i<=max;i++)
		printf("%lld  ",f[i]);
	printf("\n");
	printf("\n");*/
	}
	/*for(i=1;i<=max;i++)
		printf("%lld  ",f[i]);
	printf("\n");
	for(i=1;i<=max;i++)
		printf("%lld  ",x[i]);
	printf("\n");
	printf("\n");*/
 for(i=2;i<=max;++i)
    if(f[i]>0)
	{
      if(f[i]%2)
	  {
		  s+=((long long)x[i]*(x[i]-1)/2);
		 // printf("%lld ", s);
	  }//
           else {
			   s-=((long long)x[i]*(x[i]-1)/2);
		 //  printf("%lld ",s);
		   }
	}
 aa=(long long)n*(n-1)/2-s;
 printf("%lld\n",aa);
 return 0;
}