Cod sursa(job #588691)

Utilizator toniobFMI - Barbalau Antonio toniob Data 9 mai 2011 09:43:20
Problema Indep Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
using namespace std;

ifstream in ("indep.in");
ofstream out ("indep.out");

int n, a[2][1 << 10][300], v[1 << 9], unu[46];

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

int cmmdc (int a,int b) {
	for (int c; b; c = a % b, a = b, b = c);
	return a;
}

void citire () {
	in >> n;
	for (int i = 1; i <= n; ++i) {
		in >> v[i];
	}
}

void exe () {
	unu[0] = unu[1] = 1;
	a[1][v[1]][0] = a[1][v[1]][1] = 1;
	for (int i = 2; i <= n; ++i) {
		memset (a[i & 1], 0, sizeof (a[i & 1]));
		for (int j = 1; j < (1 << 10); ++j) {
			add (a[i & 1][cmmdc (v[i], j)], a[(i - 1) & 1][j]);
		}
		add (a[i & 1][v[i]], unu);
		for (int j = 1; j < (1 << 10); ++j) {
			add (a[i & 1][j], a[(i - 1) & 1][j]);
		}
	}
}

void afisare () {
	for (int i = a[n & 1][1][0]; i; --i) {
		out << a[n & 1][1][i];
	}
	out << '\n';
}

int main () {
	citire ();
	
	exe ();
	
	afisare ();
	
	return 0;
}