Cod sursa(job #460533)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 2 iunie 2010 22:07:11
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 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];

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;
	}
	if (t) 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=1; i<=sol[0]; i++)
	{
		sol[i]-=b[i]+t;
		if (sol[i]<0)
		{
			sol[i]+=10;
			t=1;
		}
	}
	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);
	f[1]=1;
	for (i=1; i<=h; i++)
		for (j=l; j>1; j--)
			if (j/t[i]*t[i]==j && f[j/t[i]])
			{
				f[j]=f[j/t[i]]+1;
				if ((f[j]-1)%2) dif(b[j]); else
					suma(b[j]);
			}
	for (i=sol[0]; i>0; i--) printf("%d",sol[i]);
}