Cod sursa(job #629956)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 4 noiembrie 2011 11:32:20
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<stdio.h>

#define maxn 505

FILE*f=fopen("indep.in","r");
FILE*g=fopen("indep.out","w");

int n,i,maxval,j;
int A[maxn],ciur[maxn<<1],Ap[maxn<<1],nd[maxn<<1];

struct huge{
	int n;
	int v[1000];
	
	huge () {
		n = 0;
		for ( int i = 0 ; i < 1000 ; ++i ){
			v[i] = 0;
		}
	}
}P[1001],nrs;

inline huge adunare ( huge a , huge b ){
	huge r; int i,T = 0;
	r.n = a.n > b.n ? a.n : b.n;
	for ( i = 1 ; i <= r.n ; ++i ){
		r.v[i] = a.v[i] + b.v[i] + T;
		T = r.v[i] / 10;
		r.v[i] %= 10;
	}
	if ( T ){
		r.v[++r.n] = 1;
	}
	return r;
}

inline huge scadere ( huge a , huge b ){
	huge r; int i,T = 0;
	r.n = a.n;
	for ( i = 1 ; i <= a.n ; ++i ){
		r.v[i] = a.v[i] - b.v[i] - T;
		if ( r.v[i] < 0 ){
			r.v[i] += 10; T = 1;
		}
		else{
			T = 0;
		}
	}
	while ( !r.v[r.n] && r.n > 1 ) --r.n;
	return r;
}

int main () {
	
	fscanf(f,"%d",&n);
	for ( i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d",&A[i]); ++Ap[A[i]];
		if ( A[i] > maxval )	maxval = A[i];
	}
	
	ciur[1] = 1;
	for ( i = 2 ; i <= maxval ; ++i ){
		if ( !ciur[i] ){
			ciur[i] = 1;
			for ( j = i + i ; j <= maxval ; j += i ){
				if ( !(j % (i*i)) ){
					ciur[j] = -1;
				}
				if ( ciur[j] != -1 ){
					++ciur[j];
				}
			}
		}
	}
	
	for ( i = 1 ; i <= maxval ; ++i ){
		for ( j = i ; j <= maxval ; j += i ){
			if ( Ap[j] )
				nd[i] += Ap[j];
		}
	}
	
	P[0].n = P[0].v[1] = 1; 
	for ( i = 1 ; i <= 1000 ; ++i ){
		P[i] = adunare(P[i-1],P[i-1]);
	}
	
	nrs = scadere(P[n],P[0]);
	for ( i = 2 ; i <= maxval ;  ++i ){
		if ( ciur[i] > 0 ){
			if ( !(ciur[i] & 1) ){
				nrs = adunare(nrs,scadere(P[nd[i]],P[0]));
			}
		}
	}
	
	for ( i = 2 ; i <= maxval ;  ++i ){
		if ( ciur[i] > 0 ){
			if ( ciur[i] & 1 ){
				nrs = scadere(nrs,scadere(P[nd[i]],P[0]));
			}
		}
	}
	
	for ( i = nrs.n ; i >= 1 ; --i ){
		fprintf(g,"%d",nrs.v[i]);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}