Cod sursa(job #478446)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 18 august 2010 17:52:12
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#include <string.h>
#define Nmax 502
#define Vmax 1002
#define Cmax 305
#define B 10000

int p2[Nmax][Cmax],rez[Cmax];
int a[Nmax],p[Vmax],prim[Nmax];
int n;

inline int Maxim(int x,int y){ return x>y ? x:y; }

void adun(int a[],int b[]){
	int i,t=0;
	for(i=1; i<=a[0] || i<=b[0] || t; ++i,t/=B)
		a[i]=(t+=a[i]+b[i])%B;
	a[0]=i-1;
}
void scad(int a[],int b[]){
	int i,t=0;
	for(i=1; i<=a[0]; ++i){
		a[i]=a[i]-b[i]-t;
		if( a[i]<0 ) a[i]+=B, t=1;
		else t=0;
	}
	while( !a[a[0]] ) --a[0];
}
void mul(int a[],int b){
	int i,t=0;
	for(i=1; i<=a[0] || t; ++i,t/=B)
		a[i]=(t+=a[i]*b)%B;
	a[0]=i-1;
}

int main(){
	int i,j,nr,fp,mx=0,ok,z=0;
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i) scanf("%d",&a[i]),mx=Maxim(a[i],mx);
	
	for(i=2;i<=1000;++i)
		if(!p[i]){
			prim[++z]=i;
			for(j=i*2;j<=1000;j+=i)
				p[j]++;
		}

	p2[0][0]=p2[0][1]=1; 
	for(i=1;i<=n;++i){
		memcpy(p2[i],p2[i-1],sizeof(p2[i-1]));
		mul(p2[i],2);
	}
	for(i=1;i<=n;++i) scad(p2[i],p2[0]);
	p2[0][0]=p2[0][1]=0;
	
	memcpy(rez,p2[n],sizeof(p2[n]));
	for(i=2;i<=mx;++i){
		
		for(j=1,fp=0,ok=1;j<=z && prim[j]<=i && ok;++j)
			if( i % prim[j] ==0 ){
				++fp;
				if( (i/prim[j])%prim[j] == 0 ) ok=0;
			}

		if( ! ok ) continue;
		for(nr=0,j=1;j<=n;++j)
			if( a[j] % i == 0 ) nr++;
		
		if( nr == 0 ) continue;
			
		if( fp & 1 ) scad(rez,p2[nr]);
		else adun(rez,p2[nr]);
	}
	
	if(rez[0]<0 ) rez[0]=1,rez[1]=0;
	printf("%d",rez[rez[0]]);
	for(i=rez[0]-1; i>=1; --i) printf("%04d",rez[i]);
	fclose(stdin); fclose(stdout);
	return 0;
}