Cod sursa(job #174466)

Utilizator vlad.maneaVlad Manea vlad.manea Data 8 aprilie 2008 21:22:17
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#define nmax 1000

unsigned long long p[nmax], A[nmax], sol[nmax];

unsigned long long N, ans, maxim;

void do_backtrack_dude(unsigned long long where, unsigned long long pos, unsigned long long prod, unsigned long long count)
{
	unsigned long long i, c;

	if (prod <= 1000 && prod <= maxim)
	{
		if (count > 0)
		{
			for (i = 1, c = 0; i <= N; ++i)
				if (A[i] % prod == 0)
					++c;

			c = (1<<c)-1;

			if (count%2)
				ans -= c;
			else
				ans += c;
		}
	}
	else
		return;


	for (i = pos; i <= p[0]; ++i)
	{
		if (prod * p[i] <= 1000)
		{
			sol[where] = p[i];	// scop didactic
			do_backtrack_dude(where+1, i+1, prod*p[i], count+1);
			sol[where] = 0; // scop didactic
		}
		else
			break;
	}

}

void read()
{
	unsigned long long i;

	freopen("indep.in" , "r", stdin);

	scanf("%llu", &N);

	for (i = 1; i <= N; ++i)
	{
		scanf("%llu", &A[i]);
		maxim = A[i] > maxim? A[i]: maxim;
	}
}

void solve()
{
	unsigned long long i, j, prim;

	// scot numerele prime pana la 1000
	for (p[++p[0]] = 2, i = 3; i <= 1000 && i <= maxim; i += 2)
	{
		for (prim = j = 2; prim && j <= p[0]; ++j)
			if (i % p[j] == 0)
				prim = 0;

		if (prim)
			p[++p[0]] = i;
	}

	// scot cate sunt egale cu fiecare combinare de numere prime
	// adunand sau scazand functie de cum vreau eu

	do_backtrack_dude(1, 1, 1, 0);
}

void write()
{
	freopen("indep.out", "w", stdout);

	ans = ((1 << N)-1) + ans;

	printf("%llu\n", ans);
}

int main()
{
	read();

	solve();

	write();

	return 0;
}