Cod sursa(job #594602)

Utilizator rudarelLup Ionut rudarel Data 8 iunie 2011 15:18:39
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
int d[1001],n;
int p[502][202],sol[202],s[1001];
 
void adaug(int x)
{ int k;
  if(x==0) return;
  for(k=1;k<200;k++)
     sol[k]+=p[x][k];
  for(k=1;k<199;k++)
     sol[k+1]+=sol[k]/10, sol[k]=sol[k]%10;
}
 
void scad(int x)
{ int k;
  if(x==0) return;
  for(k=1;k<200;k++)
     sol[k]-=p[x][k];
  for(k=1;k<199;k++)
  { if(sol[k]<0) sol[k+1]--, sol[k]=10+sol[k]; }
}
 
void INIT();
void READ()
{
  FILE *f;
  int i,j,x;
  f=fopen("indep.in","r");
  fscanf(f,"%d",&n);
  INIT();
  adaug(n);
  for(i=1;i<=n;i++)
  {
     fscanf(f,"%d",&x);
     for(j=2;j<=1000;j++)
        if(x%j==0) d[j]++;
 
      
  }
  s[1]=0;
  for(x=2;x<=1000;x++)
  {
     for(j=2;j<x;j++)
        if(x%j==0) if((x/j)%j==0) { s[x]=-1; break; }
                      else {  if (s[x/j]==-1) s[x]=-1; else s[x]=(s[x/j]+1)%2; break;}
     if(j==x) s[x]=1;
   }
  fclose(f);
}
 
 
 
void SOLVE()
{ int i,j;
  for(i=2;i<=1000;i++)
  {
     if(d[i]) if (s[i]==0) adaug(d[i]);
                 else if(s[i]==1) scad(d[i]);
  }
}
 
void PRINT()
{ int k;
  FILE *g;
  g=fopen("indep.out","w");
  k=199;
  while(!sol[k] && k>0) k--;
  if(k==0) fprintf(g,"0");
  while(k>=1) fprintf(g,"%d",sol[k--]);
  fprintf(g,"\n");
  fclose(g);
}
int main()
{
  READ();
  SOLVE();
  PRINT();
return 0;
}
 
 
void INIT()
{ int i,k;
  p[0][1]=1;
  for(i=1;i<=n;i++)
  {
     for(k=1;k<200;k++)
        p[i][k]=p[i-1][k]*2;
     for(k=1;k<199;k++)
        p[i][k+1]+=p[i][k]/10, p[i][k]=p[i][k]%10;
  }
  for(i=0;i<=n;i++)
     p[i][1]--;
}