Cod sursa(job #484669)

Utilizator Addy.Adrian Draghici Addy. Data 15 septembrie 2010 08:54:18
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <cstdio>
#include <cstring>

const int KMAX = 1050;
const int NMAX = 1005;
const int CMAX = 1050;

int V[NMAX], P[NMAX][CMAX], Q[KMAX], QF[KMAX], PR[KMAX], SOL[CMAX], n, i, j, k, u, x, c, NQ;

void mult (int*, int, int*), sub (int*, int*), add (int*, int*);

int main () {
	
	freopen ("indep.in", "r", stdin);
	freopen ("indep.out", "w", stdout);
	
	for (i = 2; i <= KMAX; i++)
		if (!PR[i]) {
			PR[++PR[0]] = i;
			for (j = 2 * i; j <= KMAX; j += i)
				PR[j] = 1;
		}
	
	scanf ("%d", &n);
	for (i = 1; i <= n; i++) {
		scanf ("%d", &V[i]);
		if (V[i] > k) k = V[i];
	}
	
	P[0][0] = 1, P[0][1] = 1;
	for (i = 1; i <= n; i++)
		mult (P[i-1], 2, P[i]);
	
	Q[0] = 1, QF[0] = 0;
	for (i = 1; PR[i] <= k; i++) {
		u = NQ;
		for (j = 0; j <= u; j++) {
			x = Q[j] * PR[i];
			if (x <= k)
				NQ++, Q[NQ] = x, QF[NQ] = QF[j] + 1;
		}
	}
	
	memcpy (SOL, P[n], sizeof (P[n]));
	sub (SOL, P[0]);
	
	for (i = 1; i <= NQ; i++) {
		x = Q[i], c = 0;
		for (j = 1; j <= n; j++)
			if (V[j] % x == 0)
				c++;
		
		if (QF[i] % 2) {
			add (SOL, P[0]);
			sub (SOL, P[c]);
		}
		else {
			add (SOL, P[c]);
			sub (SOL, P[0]);
		}
	}
	
	for (i = SOL[0]; i > 0; i--)
		printf ("%d", SOL[i]);
	
	if (!SOL[0])
		printf ("0");
	
	return 0;
}

void mult (int A[], int x, int B[]) {
	
	int i, t = 0;
	
	for (i = 1; i <= A[0]; i++) {
		B[i] = (A[i] * x + t) % 10;
		t = (A[i] * x + t) / 10;
	}
	
	B[0] = A[0];
	while (t) {
		B[++B[0]] = t % 10;
		t /= 10;
	}
}

void sub (int A[], int B[]) {
	
	int i, t = 0;
	
	for (i = B[0] + 1; i <= A[0]; i++)
		B[i] = 0;
	
	for (i = 1; i <= A[0]; i++) {
		A[i] -= (B[i] + t);
		if (A[i] < 0) A[i] += 10, t = 1;
		else t = 0;
	}
	
	while (!A[A[0]] && A[0] > 0)
		A[0]--;
}

void add (int A[], int B[]) {
	
	int i, max, aux, t = 0;
	
	for (i = B[0] + 1; i <= A[0]; i++)
		B[i] = 0;
	for (i = A[0] + 1; i <= B[0]; i++)
		A[i] = 0;
	
	max = A[0] > B[0] ? A[0] : B[0];
	for (i = 1; i <= max; i++) {
		aux = A[i];
		A[i] = (aux + B[i] + t) % 10;
		t = (aux + B[i] + t) / 10;
	}
	
	if (t)
		A[++A[0]] = t;

}