Cod sursa(job #183270)

Utilizator marinMari n marin Data 21 aprilie 2008 21:35:26
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
#include<math.h>

int  l,a[1010],ok2,nrf,aux,ok,d,m,p,i,v[1110],max,j;

char ap[1111],t[1111];
int P[1111];
long long A,res,n;


int main(){


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

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

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

   ap[v[i]]=1;

  }

fclose(f);


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

     }

   }



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

   }

//   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<=(int)sqrt(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;
       m=0;

       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){

      A=1;
	for(l=1;l<=a[i];l++)
	A*=2;

	A--;
//	A-=a[i];


      res-=A;

      }

      else{

      A=1;
	for(l=1;l<=a[i];l++)
	A*=2;

	A--;
//	A-=a[i];


      res+=A;


      }


     }


   }


  }



FILE *g=fopen("indep.out","w");
fprintf(g,"%lld",(1l<<n)-1+res);
fclose(g);

return 0;
}