Cod sursa(job #8524)

Utilizator t30Rosu Teodor t30 Data 24 ianuarie 2007 22:18:44
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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(j=2;j<x;j++)
		if(x%j==0) if((x/j)%j==0) { s[x]=-1; break; }
					  else { s[x]=(s[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\n");
  while(k>=1) fprintf(g,"%d",sol[k--]);
  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]--;
}