Cod sursa(job #34955)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 21 martie 2007 17:58:09
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <string.h>

#define BASE 1000000

const int N_MAX = 512;
const int C_MAX = 1024;

int v[N_MAX], cur[C_MAX][C_MAX], ant[C_MAX][C_MAX];
int unu[3];

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;
}

int cmmdc(int a, int b)
{
	if (b == 0) {
		return a;
	} else {
		return (cmmdc(b, a % b));
	}
}

int main()
{
	freopen("indep.in", "r", stdin);
#ifndef _BLA_
	freopen("indep.out", "w", stdout);
#endif

	int N, i, MAX = 0;
	scanf("%d\n", &N);
	for (i = 1; i <= N; i ++) {
		scanf("%d\n", &v[i]);
		if (v[i] > MAX) {
			MAX = v[i];
		}
	}

	unu[0] = 1, unu[1] = 1;
	int j;
	for (i = 1; i <= N; i ++) {
		add(cur[v[i]], unu);
		for (j = 1; j <= MAX; j ++) {
			add(cur[cmmdc(v[i], j)], ant[j]);
			add(cur[j], ant[j]);
		}

		memcpy(ant, cur, sizeof(cur));
		memset(cur, 0, sizeof(cur));
	}

	/*for (i = ant[1][0]; i >= 1; i --) {
		printf("%d", ant[1][i]);
	}
	printf("\n");*/

	printf("%d", ant[1][ant[1][0]]);
	for (i = ant[1][0] - 1; i >= 1; i --) {
		printf("%08d", ant[1][i]);
	}

	return 0;
}