Cod sursa(job #827906)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 2 decembrie 2012 19:57:17
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>

using namespace std;

const int MAXN = 510;
const int MAXE = 10010;
const int MAXC = 50;
const int BASE = 1000000000;

int A[MAXN];
int D[MAXE][MAXC];
int Unu[MAXC];

inline int cmmdc (int A, int B)
{
	if (B > A)
		return cmmdc (B, A);
	
	if (!B)
		return A;
	
	int r = A % B;
	
	while (r){
		A = B;
		B = r;
		r = A % B;
	}
	
	return B;
}

void AddHuge (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 Afis (int *A)
{
	printf ("%d", A[ A[0] ]);
	
	for (int i = A[0] - 1; i > 0; i --)
		printf ("%09d", A[i]);
}

int main ()
{
	freopen ("indep.in", "r", stdin);
	freopen ("indep.out", "w", stdout);
	
	int N, i, j, Max = -1;
	Unu[0] = Unu[1] = 1;
	
	scanf ("%d\n", &N);
	
	for (i = 1; i <= N; i ++){
		scanf ("%d\n", A + i);
		
		if (A[i] > Max)
			Max = A[i];
	}
	
	for (i = 1; i <= N; i ++){
		for (j = 1; j <= Max; j ++)
			AddHuge (D[ cmmdc (j, A[i]) ], D[j]);
		
		AddHuge (D[ A[i] ], Unu);
	}
	
	Afis (D[1]);
	
	return 0;
}