Cod sursa(job #393335)

Utilizator ooctavTuchila Octavian ooctav Data 9 februarie 2010 11:40:10
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#define NMAX 501
#define VALMAX 1001
#define CIFREMAX 301
int N;
int e[NMAX];
int G[VALMAX];
int par[VALMAX];
int p[NMAX][CIFREMAX];
int rez[CIFREMAX];

void citire()
{
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
		scanf("%d",&e[i]);
}

void scriere()
{
	for(int i=rez[0];i;i--)
		printf("%d",rez[i]);
}

void ciur_constructie()
{	
	int ciur[VALMAX]={0},prime[VALMAX]={0};
	
	for(int i=2;i<=VALMAX;i++)
		if(!ciur[i])
		{
			par[i]=1,prime[i]=1;
			for(int j=i*i;j<=VALMAX;j+=i)
				ciur[j]=1;
		}
		
	for(int i=2;i<=VALMAX;i++)
		if(!ciur[i])
			for(int j=i+1;j<=VALMAX;j++)
				if(!ciur[j] && i*j<=VALMAX)
				{
					prime[i*j]=1;
					par[i*j]=par[i]+par[j];
				}
		
	G[1]=N;
	for(int i=1;i<=VALMAX;i++)
		if(prime[i])
			for(int j=1;j<=N;j++)
				if(e[j]%i==0)
					G[i]++;
				
}

void precalculare()
{
	p[1][0]=1;p[1][1]=2;
	for(int i=2;i<=N;i++)
	{
		int j,t=0;		
		for(j=1;j<=p[i-1][0] || t;j++,t=t/10)
			p[i][j]=(t+=p[i-1][j]*2)%10;
		p[i][0]=j-1;
	}
	for(int i=1;i<=N;i++)
		p[i][1]--;
}


void adunare(int x)
{
	int i,t=0;
	for(i=1;i<=p[x][0] || i<=rez[0] || t;i++,t=t/10)
		rez[i]=(t+=rez[i]+p[x][i])%10;
	rez[0]=i-1;
}

void scadere(int x)
{
	int t=0;
	for(int i=1;i<=rez[0];i++)
		rez[i]+=(t=(rez[i]-=p[x][i]+t)<0)*10;
	while(rez[0]>1 && !rez[rez[0]])
		rez[0]--;
}

void rezolvare()
{
	for(int i=1;i<=VALMAX;i++)
		if(G[i])
			if(par[i]%2==0)
				adunare(G[i]);
			else
				scadere(G[i]);
}

int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	citire();
	precalculare();
	ciur_constructie();
	rezolvare();
	scriere();
	return 0;
}