Cod sursa(job #95734)

Utilizator damaDamaschin Mihai dama Data 29 octombrie 2007 22:01:45
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <string.h>


int n, v[512], prime[170], used[1024], cnt, nr, p = 1, sol[1000], maxval;

void gen();
void bkt(int);
void add(int*, int*);
void sub(int*, int*);
void mul(int*, int);

int main()
{
	freopen("indep.in", "r", stdin);
	freopen("indep.out", "w", stdout);

	int i;
	scanf("%d", &n);

	for(i = 1; i <= n; ++i)
	{
		scanf("%d", &v[i]);
		if(v[i] > maxval)
		{
			maxval = v[i];
		}
	}

	gen();

	sol[0] = sol[1] = 1;
	for(i = 1; i <= n; ++i)
	{
		mul(sol, 2);
	}

	--sol[1];
	/*
	for(i = sol[0]; i > 0; --i)
	{
		printf("%d", sol[i]);
	}
	printf("\n");
	*/
	bkt(1);
	for(i = sol[0]; i > 0; --i)
	{
		printf("%d", sol[i]);
	}
	if(sol[0] == 0)
	{
		printf("0\n");
	}

	return 0;
}

void gen()
{
	int i, j;

	for(i = 2; i < 1024; ++i)
	{
		if(!used[i])
		{
			prime[++cnt] = i;
			for(j = 2 * i; j < 1024; j += i)
			{
				used[j] = 1;
			}
		}
	}
}

void bkt(int k)
{
	int temp[1000];
	memset(temp, 0, sizeof(temp));
	temp[0] = temp[1] = 1;
	if(k == cnt + 1)
	{
		int i, d = 0;
		if(nr)
		{
			for(i = 1; i <= n; ++i)
			{
				if(v[i] % p == 0)
				{
					++d;
				}
			}
			for(i = 1; i <= d; ++i)
			{
				mul(temp, 2);
			}
			--temp[1];

			if(nr % 2)
			{
				sub(sol, temp);
			}
			else
			{
				add(sol, temp);
			}
			/*
			printf("%d ---", p);
			for(i = sol[0]; i > 0; --i)
			{
				printf("%d", sol[i]);
			}
			printf("\n");
			*/
		}
	}
	else
	{	
		bkt(k + 1);
		p *= prime[k];
		++nr;
		if(p <= maxval)
		{
			bkt(k + 1);
		}
		p /= prime[k];
		--nr;
	}
}


void mul(int* a, int b)
{
	int i, t;
	for(i = 1, t = 0; i <= a[0] || t; ++i, t /= 10)
	{
		a[i] = (t += a[i] * b) % 10;
	}
	a[0] = i - 1;
}

void add(int* a, int* b)
{
	int i, t;
	for(i = 1, t = 0; i <= a[0] || i <= b[0] || t; ++i, t /= 10)
	{
		a[i] = (t += a[i] + b[i]) % 10;
	}

	a[0] = i - 1;
}

void sub(int* a, int* b)
{
	int i;
	for(i = 1; i <= b[0]; ++i)
	{
		a[i] -= b[i];
		if(a[i] < 0)
		{
			a[i] += 10;
			--a[i + 1];
		}
	}
	while(!a[a[0]] && a[0])
	{
		--a[0];
	}
}