Cod sursa(job #222910)

Utilizator cristiprgPrigoana Cristian cristiprg Data 26 noiembrie 2008 09:37:19
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb

 #include <cstdio>  
 FILE *in, *out;  
 int v[1000000],contor,x[1000000],max=-1,c[100000];  
 long long n;
   
 bool prime (int a, int b)  
 {  
     
   if (b==1) return true;  
   int c=a%b;  
   while (c)  
   {  
     a=b;  
     b=c;  
     c=a%b;  
   }  
     
   if (b==1)  return true;  
    
   return false;  
 }  
   
   
 int main()  
 {  
   in = fopen ("pairs.in", "r");  
   out = fopen ("pairs.out", "w");  
   fscanf (in, "%lld", &n);  
   int i,j;  
   for (i=1; i<=n; ++i)  
   {
   	  fscanf (in, "%d", &c[i]);  
   	  if (max<c[i])
   	    max=c[i];
   	    
   	  v[ c[i] ] = 1;
	}
  
     
   for (i=2; i<=max; ++i)
     for (j=i; j<=max; j+=i)
       x[i]+=v[j];
    
   //for (i=1; i<=max; ++i)
   //  printf ("%d ",x[i]);
   
   long long int res=0,nrdiv,putere,k;
   for (i=2; i<=max; ++i)   
     if (x[i]>1)
     {
       nrdiv=0;
       k=i;
       int d=2;
       putere=0;
       while(k%d==0 && nrdiv>-1)
       		k/=d,putere++;
       if(putere>1)
       	nrdiv=-1,k=0;
       else
       if(putere==1)
       		nrdiv++;
       d=3;
       while (k>1 && nrdiv>-1)
       {
        putere=0;
       	while(k%d==0)
       		k/=d,putere++;
       	if(putere>1)
       		nrdiv=-1;
       	else
       		if(putere==1)
       			nrdiv++;
       	d+=2;
       		
       	if(d*d>k && k>1 && nrdiv>-1)
       		nrdiv++,k=1;
      }
      //fprintf(out,"%d \n",i);
      //printf("i=%d nrdiv=%lld ", i,nrdiv);
      if(nrdiv>-1 && nrdiv%2==1)
      
      	res+=x[i]*(x[i]-1)/2;
      else
      	res-=x[i]*(x[i]-1)/2;
      //printf ("i=%d res= %lld   \n",i,res);
     }
        
         
       
     
   
   //if (n%2==0)
     fprintf (out, "%lld", (n)*(n-1)/2-res);  
   //else
     //fprintf (out, "%lld", ((n-1)/2)*n-res);
   
     
   fclose (in);  
   fclose (out);  
   return 0; 
}