Cod sursa(job #991075)

Utilizator cont_de_testeCont Teste cont_de_teste Data 29 august 2013 17:34:21
Problema Indep Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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


const int MAX_N = 510;
const int MAX_V = 1010;
const int MAX_D = 100;

int n;
int v[MAX_N];

int dp[2][MAX_V][MAX_D];


inline int cmmdc(const int &a, const int &b) {
	if (!b) return a;
	return cmmdc(b, a % b);
}

inline 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 main() {
	fin >> n;
	for (int i = 1; i <= n; ++i)
		fin >> v[i];
	
	// dp[i][j] = k; max k elements from first i elements, cmmdc = j;
	dp[1][v[1]][0] = dp[1][v[1]][1] = 1;
	for (int i = 2; i <= n; ++i) {
		int line = i & 1;
		dp[line][v[i]][0] = dp[line][v[i]][1] = 1;
		for (int j = 1; j < MAX_V; ++j) {
			add(dp[line][j], dp[!line][j]);
		}
		for (int j = 1; j < MAX_V; ++j) {
			int c = cmmdc(j, v[i]);
			add(dp[line][c], dp[!line][j]);
		}
		memset(dp[!line], 0, sizeof(dp[!line]));
	}
	
	if (dp[n & 1][1][0] == 0)
		fout << "0";
	for (int i = dp[n & 1][1][0]; i >= 1; --i)
		fout << dp[n & 1][1][i];
	
	fin.close();
	fout.close();
}