Cod sursa(job #1111929)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 februarie 2014 11:41:26
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;

int n, gcd[1005][1005];

inline int fgcd(int a, int b) {
	if (!b) return a;
	return fgcd(b, a % b);
}


const int base = 1000 * 1000 * 1000;
int dp[2][1005][205], unu[205];
void add(int A[], int B[]) {
	int i, t = 0;
	for (i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= base)
		A[i] = (t += A[i] + B[i]) % base;
	A[0] = i - 1;
}
void write(int a) {
	printf("%.9d", a);
}

int main() {
	#ifdef INFOARENA
	ifstream cin("indep.in");
	freopen("indep.out", "r", stdout); // firar el de cloud ide
	#endif
	
	for (int i = 1; i <= 1000; ++i)
		for (int j = 1; j <= 1000; ++j)
			gcd[i][j] = fgcd(i, j);
	
	unu[0] = unu[1] = 1;
	
	cin >> n;
	for (int ni = 1; ni <= n; ++ni) {
		int a;
		cin >> a;
		
		int crl = ni % 2;
		for (int i = 1; i <= 1000; ++i) {
			add(dp[crl][gcd[i][a]], dp[!crl][i]);
			add(dp[crl][i], dp[!crl][i]);
		}
		add(dp[crl][a], unu);
		memset(dp[!crl], 0, sizeof(dp[!crl]));
	}
	
	int crl = n % 2;
	printf("%d", dp[crl][1][dp[crl][1][0]]);
	for (int i = dp[crl][1][0] - 1; i >= 1; --i)
		write(dp[crl][1][i]);
	
	#ifdef INFOARENA
	cin.close();
	#endif
}