Cod sursa(job #461056)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 5 iunie 2010 15:00:52
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#define nmax 510
#define l 1000
#define lmax 10000

int n, v[nmax], a[nmax], b[l+5][lmax], sol[lmax], t[nmax], h, f[l+5], g[nmax];

void put(int b[lmax], int p)
{
	int i, t;
	b[0]=1;
	b[1]=1;
	while (p--)
	{
		t=0;
		for (i=1; i<=b[0]; i++)
		{
			b[i]=b[i]*2+t;
			t=b[i]/10;
			b[i]%=10;
		}
		if (t) b[++b[0]]=t;
	}
}

void minus1(int b[lmax])
{
	int i, t=1;
	for (i=1; i<=b[0] && t; i++)
	{
		b[i]-=t;
		if (b[i]<0)
		{
			b[i]+=10;
			t=1;
		} else t=0;
	}
	while (!b[b[0]]) b[0]--;
}

void suma(int b[lmax])
{
	int i, t=0;
	if (b[0]>sol[0]) sol[0]=b[0];
	for (i=1; i<=sol[0]; i++)
	{
		sol[i]+=b[i]+t;
		t=sol[i]/10;
		sol[i]%=10;
	}
	if (t) sol[++sol[0]]=t;
}

void dif(int b[lmax])
{
	int i, t=0;
	for (i=b[0]+1; i<=sol[0]; i++) b[i]=0;
	for (i=1; i<=sol[0]; i++)
	{
		sol[i]-=b[i]+t;
		if (sol[i]<0)
		{
			sol[i]+=10;
			t=1;
		} else t=0;
	}
	while (!sol[sol[0]]) sol[0]--;
}

int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%d",&n);
	int i, d, ok, j, c;
	for (i=1; i<=n; i++) scanf("%d",&v[i]);
	for (d=2; d<=l; d++)
	{
		ok=1;
		for (c=2; c*c<=d; c++)
			if (!(d%c))
			{
				ok=0;
				break;
			}
		if (ok) 
			for (i=1; i<=n; i++)
				if (!(v[i]%d)) 
				{
					t[++h]=d;
					break;
				}
	}
	for (d=2; d<=l; d++)
		for (i=1; i<=n; i++)
			if (!(v[i]%d)) a[d]++;
	for (i=2; i<=l; i++) 
	{
		put(b[i], a[i]);
		minus1(b[i]);
	}
	put(sol, n);
	minus1(sol);
	g[1]=1;
	for (c=1; c<6; c++)
	{
		for (j=1; j<=l; j++)
		{
			f[j]=g[j];
			g[j]=0;
		}
		for (i=1; i<=h; i++)
			for (j=2; j<=l; j++)
				if (j/t[i]*t[i]==j && f[j/t[i]] && (j/t[i])%t[i] && !g[j]) 
				{
					g[j]=1;
					if (c%2) dif(b[j]); else suma(b[j]);
				}
	}
	if (sol[0]<0) 
	{
		sol[0]=1;
		sol[1]=0;
	}
	for (i=sol[0]; i>0; i--) printf("%d",sol[i]);
}