Cod sursa(job #80094)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 26 august 2007 00:26:56
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<stdio.h>
long int i,j,n,nd[1010],a[1010],d[6][1010],
cit,p,q,r,s,cont[1001],binar[510],
p2[510],sol[510],poz;
int main()
{
	FILE *f,*g;
	f=fopen("indep.in","r");
	g=fopen("indep.out","w");
	fscanf(f,"%ld",&n);
	for(i=1;i<=1000;i++) a[i]=i;
	for(i=2;i<=1000;i++)
	 if(a[i]>1)
	  for(j=i;j<=1000;j=j+i)
	   { nd[j]++;
	     d[nd[j]][j]=i;
	     while(a[j]%i==0)a[j]/=i;
	   }
	for(i=1;i<=n;i++)
	{  fscanf(f,"%ld",&cit);
	   if(cit>1)
	    {
	      if(nd[cit]==1)
	      {
	       p=d[1][cit];
	       cont[p]++;
	      }
	      else
	       if(nd[cit]==2)
		{
		 p=d[1][cit];
		 q=d[2][cit];
		 cont[p]++;
		 cont[q]++;
		 cont[p*q]++;
		}
		else
		 if(nd[cit]==3)
		  {
		    p=d[1][cit];
		    q=d[2][cit];
		    r=d[3][cit];
		    cont[p]++;
		    cont[q]++;
		    cont[r]++;
		    cont[p*q]++;
		    cont[p*r]++;
		    cont[q*r]++;
		    cont[p*q*r]++;
		  }
		  else
		   {
		    p=d[1][cit];
		    q=d[2][cit];
		    r=d[3][cit];
		    s=d[4][cit];
		    cont[p]++;
		    cont[q]++;
		    cont[r]++;
		    cont[s]++;
		    cont[p*q]++;
		    cont[p*r]++;
		    cont[q*r]++;
		    cont[p*s]++;
		    cont[q*s]++;
		    cont[r*s]++;
		    cont[p*q*r]++;
		    cont[p*q*s]++;
		    cont[p*r*s]++;
		    cont[q*r*s]++;
		    cont[p*q*r*s]++;
		   }
		}
	}
	for(i=0;i<n;i++)binar[i]=1;
	for(i=2;i<=1000;i++)
	 if(cont[i]==n)
	 { fprintf(g,"0\n");
	   fcloseall();
	   return 0;
	 }
	for(i=2;i<=1000;i++)
	 if(cont[i]){ if(nd[i]%2)for(j=0;j<cont[i];j++)binar[j]--;else for(j=0;j<cont[i];j++)binar[j]++;}
	for(i=0;i<=500;i++){ while(binar[i]<0){ binar[i]+=2;binar[i+1]--;}while(binar[i]>1){ binar[i]-=2;binar[i+1]++;}}
	p2[0]=1;
	for(i=0;i<=500;i++){ if(binar[i]){ for(j=0;j<=500;j++)sol[j]+=p2[j];for(j=0;j<=500;j++){sol[j+1]+=sol[j]/10;sol[j]%=10;}}for(j=0;j<=500;j++)p2[j]*=2;for(j=0;j<=500;j++){p2[j+1]+=p2[j]/10;p2[j]%=10;}}
	poz=500;
	while(!sol[poz])poz--;
	if(poz==-1) fprintf(g,"0\n");
	else
	 { for(i=poz;i>=0;i--)
	    fprintf(g,"%ld",sol[i]);
	    fprintf(g,"\n");
	 }
	fcloseall();
	return 0;
}