Cod sursa(job #122772)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 13 ianuarie 2008 17:28:48
Problema Indep Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <string.h>

#define BASE 1000000000

const int N_MAX = 512;
const int V_MAX = 1024;

int v[N_MAX];
int a[2][V_MAX][N_MAX];

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

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 unu[N_MAX];

void afis(int v[])
{
	int i;
	for (i = v[0]; i >= 1; i --) printf("%d", v[i]);
	printf(" ");
}

int main()
{
	freopen("indep.in", "r", stdin);
#ifndef _SCREEN_
	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];
	}

	int j, pos = 1, cur = 1, ant = 0;
	unu[0] = 1, unu[1] = 1;

	a[0][v[1]][0] = 1, a[0][v[1]][1] = 1;

	for (i = 2; i <= N; i ++) {

		cur = pos, ant = pos ^ 1;

		memset(a[cur], 0, sizeof(a[cur]));

		for (j = 1; j <= MAX; j ++) {
			ADD(a[cur][j], a[ant][j]);
			ADD(a[cur][cmmdc(j, v[i])], a[ant][j]);
		}
		a[cur][v[i]][1] ++;
		j = 1;
		while (a[cur][v[i]][j] == 10) {
			a[cur][v[i]][j] = 0;
			j ++;
			a[cur][v[i]][j] ++;
		}

		pos ^= 1;
	}

	if (a[cur][1][0] == 0) printf("0\n");
	else {
		printf("%d", a[cur][1][a[cur][1][0]]);
		for (i = a[cur][1][0] - 1; i >= 1; i --) {
			printf("%09d", a[cur][1][i]);
		}	
		printf("\n");
	}

	return 0;
}