Cod sursa(job #460534)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 2 iunie 2010 22:12:12
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#define nmax 510
#define l 1000
#define lmax 10000

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

void put(int &b, int p)
{
	int i, t;
	b=1;
	while (p--) b*=2;
}

void minus1(int b)
{
	b--;
}

void suma(int b)
{
	sol+=b;
}

void dif(int b)
{
	sol-=b;
}

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]);
			}
	printf("%d",sol);
}