Cod sursa(job #393124)

Utilizator ooctavTuchila Octavian ooctav Data 8 februarie 2010 22:07:35
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 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 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;
		p[i][p[i][0]]--;
		if(!p[i][p[i][0]])
			p[i][0]--;
	}
}

void ciur_constructie()
{	
	int ciur[VALMAX]={0},prime[VALMAX]={0};
	
	for(int i=2;i<=VALMAX;i++)
		if(!ciur[i])
			for(int j=i*i;j<=VALMAX;j++)
				ciur[j]=1;
			
	for(int i=2;i<=VALMAX;i++)
		if(!ciur[i])
		{
			prime[i]=1;
			par[i]=1;
			for(int j=i+1;j<=VALMAX;j+=i)
				if(!ciur[j])
				{
					prime[i*j]=1;
					if(par[i]==par[j])
						par[i*j]=0;
					else
						par[i*j]=0;
				}
		}
	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 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]>1)
			if(par[i]==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;
}