Cod sursa(job #1236818)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 2 octombrie 2014 17:33:31
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <fstream>
#include <algorithm>
#define DIM 1002
#define infile "indep.in"
#define outfile "indep.out"

using namespace std;

ifstream f(infile);
ofstream g(outfile);

struct data {
	int x;
	int p;
} a[DIM];

int v[DIM];

bool cmp(const data &a, const data &b) {
	return a.p < b.p;
}

int S[3][DIM], P2[DIM][DIM];

int n, k;

int main() {
	f >> n;
	for (int i = 1; i <= n; ++i)
		f >> v[i];
	for (int i = 2; i <= 1000; ++i) {
		int nr = i, np = 0;
		for (int j = 2; j*j <= nr; ++j)
		if (nr%j == 0) {
			++np;
			nr /= j;
			if (nr%j == 0) {
				nr = -1;
				break;
			}
		}
		if (nr != -1) {
			if (nr != 1)
				++np;
			a[++k].x = i;
			a[k].p = np;
		}
	}
	sort(a + 1, a + k + 1, cmp);
	P2[0][0] = 1;
	P2[0][1] = 0;
	for (int i = 1; i <= n; ++i) {
		int t = 0;
		for (int j = 1; j <= P2[i - 1][0]; ++j) {
			P2[i][++P2[i][0]] = 2 * P2[i - 1][j] + t;
			t = P2[i][P2[i][0]] / 10;
			P2[i][P2[i][0]] %= 10;
		}
		if (t != 0)
			P2[i][++P2[i][0]] = 1;
		t = 0;
		P2[i][1] += 1;
		t = P2[i][1] / 10;
		P2[i][1] %= 10;
		for (int j = 2; j <= P2[i][0] && t!=0; ++j) {
			P2[i][j] += 1 + t;
			t = P2[i][j] / 10;
			P2[i][j] %= 10;
		}
		if (t != 0)
			P2[i][++P2[i][0]] = t;
	}
	S[1][0] = S[2][0] = 1;
	S[1][1] = S[2][1] = 0;
	for (int i = 0; i <= P2[n][0]; ++i)
		S[1][i] = P2[n][i];
	for (int i = 1; i <= k; ++i) {
		int nr = 0;
		for (int j = 1; j <= n; ++j)
		if (v[j] % a[i].x == 0)
			++nr;
		if (nr == 0)
			continue;
		if (a[i].p % 2 == 0) {
			int t = 0;
			int l;
			if (P2[nr][0] > S[1][0]) {
				for (l = S[1][0] + 1; l <= P2[nr][0];) 
					S[1][l++] = 0;
				S[1][0] = P2[nr][0];
			}
			else 
			for (l = P2[nr][0] + 1; l <= S[1][0];) 
				P2[nr][l++] = 0;
			for (l = 1; l <= S[1][0]; l++) {
				S[1][l] += P2[nr][l] + t;
				t = S[1][l] / 10;
				S[1][l] %= 10;
			}
			if (t) 
				S[1][++S[1][0]] = t;
		}
		else {
			int t = 0;
			int l;
			if (P2[nr][0] > S[2][0]) {
				for (l = S[2][0] + 1; l <= P2[nr][0];)
					S[2][l++] = 0;
				S[2][0] = P2[nr][0];
			}
			else
			for (l = P2[nr][0] + 1; l <= S[2][0];)
				P2[nr][l++] = 0;
			for (l = 1; l <= S[2][0]; l++) {
				S[2][l] += P2[nr][l] + t;
				t = S[2][l] / 10;
				S[2][l] %= 10;
			}
			if (t)
				S[2][++S[2][0]] = t;
		}
	}
	int t = 0;
	for (int i = S[2][0] + 1; i <= S[1][0]; ++i) 
		S[2][i] = 0;
	for (int i = 1; i <= S[1][0]; ++i)
		S[1][i] += (t = (S[1][i] -= S[2][i] + t)<0) ? 10 : 0;
	while (!S[1][S[1][0]]) 
		S[1][0]--;
	for (int i = S[1][0]; i>0; --i)
		g << S[1][i];
	return 0;
}

//This room. This bullet. There's a bullet for everyone. And a time. And a place. Yes... maybe this is how it has to be. - 47