Cod sursa(job #222911)

Utilizator cristiprgPrigoana Cristian cristiprg Data 26 noiembrie 2008 09:47:30
Problema Pairs Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb

 #include <cstdio>  
 FILE *in, *out;  
 int v[1000000],contor,x[1000000],max=-1,c[100000];  
 long long n;
   
 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\n", i,nrdiv);
      if(nrdiv>-1)
      if( 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; 
}