Cod sursa(job #182833)

Utilizator katakunaCazacu Alexandru katakuna Data 21 aprilie 2008 13:22:37
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<stdio.h>

long long  a[1000010],ok2,nrf,aux,ok,d,m,res,p,n,i,v[100010],max,j;
char ap[1000010],t[1001110];
int P[101100];


int main(){


FILE *f=fopen("pairs.in","r");
fscanf(f,"%lld",&n);

  for(i=1;i<=n;i++){
  fscanf(f,"%lld",&v[i]);

   if(v[i]>max)
   max=v[i];

   ap[v[i]]=1;

  }

fclose(f);


   for(i=2;i<=max;i++){
     for(j=i;j<=max;j+=i){
       if(ap[j])
       a[i]++;

     }

   }



   for(i=2;i<=max;i++){
    if(!t[i])
      for(j=i+i;j<=max;j+=i)
      t[j]=1;

   }


p=0;

   for(i=2;i<=max;i++)
   if(!t[i]){
   p++;
   P[p]=i;
   }


  for(i=2;i<=max;i++){

   if(a[i]){
   nrf=0;
   aux=i;
   ok=1;
   d=1;
   m=0;

     while(aux!=1&&d<=p){
     ok2=1;

       while(!(aux%P[d])){

	if(ok2)
	nrf++;

       m++;

       aux/=P[d];
       }

      if(m>1){
      ok=0;
      break;
      }


     d++;
     }


     if(ok){

      if(aux>1)
      nrf++;

      if(nrf%2==1)
      res+=(a[i]*(a[i]-1))/2;

      else
      res-=(a[i]*(a[i]-1))/2;

     }


   }


  }



FILE *g=fopen("pairs.out","w");
fprintf(g,"%lld",n*(n-1)/2 - res);
fclose(g);

return 0;
}