Cod sursa(job #478425)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 18 august 2010 16:39:22
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <string.h>
#define Nmax 502
#define Vmax 1002
#define Cmax 305
#define B 1000000

int p2[Nmax][Cmax],rez[Cmax];
int a[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,aux,d,fp,mx=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);

	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){
		
		aux=i;
		if(aux % 2==0){
			fp=1;
			if( (aux/2) % 2 ==0 ) continue;
		}
		else fp=0;
		for(d=3;d<=aux;d+=2)
			if( aux % d==0 ){
				++fp;
				if( (aux/d)%d==0) 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]);
	}
	
	printf("%d",rez[rez[0]]);
	for(i=rez[0]-1; i>=1; --i) printf("%06d",rez[i]);
	fclose(stdin); fclose(stdout);
	return 0;
}