Cod sursa(job #215212)

Utilizator swift90Ionut Bogdanescu swift90 Data 17 octombrie 2008 20:07:42
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<stdio.h>
int N,nr[1010];
int div[1010];
int put[505][200];
int sol[200];
void diviz(){
	int i,j;
	for(i=2;i<1001;++i){
		if(div[i]==1)
			for(j=i;j<1001;j+=i)
				div[j]=-10000;
		if(div[i]==0){
			for(j=i;j<1001;j+=i)
				++div[j];
		}
	}
	div[2]=1;
}
void putere(){
	int t,i,ss,bb[200];
	for(i=0;i<200;++i)
		bb[i]=0;
	put[0][0]=put[0][1]=1;
	bb[0]=bb[1]=1;
	for(ss=1;ss<=N;++ss){
		for(i=1,t=0;i<=put[ss-1][0] || t;++i,t/=10)
			put[ss][i]=(t+=put[ss-1][i]*2)%10;
		put[ss][0]=i-1;
		
		for(i=1;i<=put[ss-1][0];++i)
			put[ss-1][i]+= (t= (put[ss-1][i]-=bb[i]+t)<0)*10;
		for(;put[ss-1][0]>1 && !put[ss-1][put[ss-1][0]];put[ss-1][0]--);
	}
	for(i=1;i<=put[ss-1][0];++i)
		put[ss-1][i]+= (t= (put[ss-1][i]-=bb[i]+t)<0)*10;
	for(;put[ss-1][0]>1 && !put[ss-1][put[ss-1][0]];put[ss-1][0]--);
}
int main(){
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	int i,j,x,t;
	scanf("%d",&N);
	diviz();
	putere();
	for(i=0;i<N;++i){
		scanf("%d",&x);
		for(j=2;j<1001;++j)
			if(x%j==0 && div[j]>0)
				++nr[j];
	}
	for(i=0;i<=put[N][0];++i)
		sol[i]=put[N][i];
	
	for(x=2;x<=1001;++x){
		if(div[x]>0 && nr[x]){
			if(div[x]%2==1){
				for (i = 1,t=0; i <= sol[0]; i++)
					sol[i] += (t = (sol[i] -= put[nr[x]][i] + t) < 0) * 10;
				for (; sol[0] > 1 && !sol[sol[0]]; sol[0]--);
			}
			else{
				for (i=1,t=0; i<=sol[0] || i<=put[nr[x]][0] || t; i++, t/=10)
					sol[i] = (t += sol[i] + put[nr[x]][i]) % 10;
				sol[0] = i - 1;
			}
		}
	}
	for(i=sol[0];i;--i)
		printf("%d",sol[i]);
	printf("\n");
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}