Cod sursa(job #183046)

Utilizator katakunaCazacu Alexandru katakuna Data 21 aprilie 2008 17:43:38
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include<stdio.h>   
#include<math.h>   
  
  

void ad(int *A, int *B)   
{   
      int i, t = 0;   
      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)   
              A[i] = (t += A[i] + B[i]) % 10;   
      A[0] = i - 1;   
}  


void sc(int *A, int *B)   
{   
      int i, t = 0;   
      for (i = 1; i <= A[0]; i++)   
              A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;   
      for (; A[0] > 1 && !A[A[0]]; A[0]--);   
}  


void inm(int *A, int B)   
{   
      int i, t = 0;   
      for (i = 1; i <= A[0] || t; i++, t /= 10)   
              A[i] = (t += A[i] * B) % 10;   
      A[0] = i - 1;   
}  




int AA[105],UNU[4]={1,1},res[105],A[105],ok2,l,p,P[1003],nrf,aux,ok,d,m,n,i,v[1003],max,j,a[1003];
char ap[1001],t[1006];


int main(){


FILE *f=fopen("indep.in","r");
fscanf(f,"%d",&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<=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=1;i<=max;i++){

    if(a[i]>1){
    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[0]=1;
    A[1]=1;


      for(l=2;l<=100;l++){
      A[l]=0;
      AA[l]=0;
      }

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

      sc(A,UNU);

	 aux=a[i];

      AA[0]=0;
      AA[1]=0;

	 while(aux!=0){
	 AA[0]++;
	 AA[AA[0]]=aux%10;
	 aux/=10;
	 }

      sc(A,AA);


       sc(res,A);


       }

       else{

    A[0]=1;
    A[1]=1;


      for(l=2;l<=100;l++){
      A[l]=0;
      AA[l]=0;
      }

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

      sc(A,UNU);

	 aux=a[i];

      AA[0]=0;
      AA[1]=0;

	 while(aux!=0){
	 AA[0]++;
	 AA[AA[0]]=aux%10;
	 aux/=10;
	 }

      sc(A,AA);


       ad(res,A);

       }

     }

    }

  }



FILE *g=fopen("indep.out","w");

for(i=res[0];i>=1;i--)
fprintf(g,"%d",res[i]);

fclose(g);

return 0;
}