Cod sursa(job #96635)

Utilizator victorsbVictor Rusu victorsb Data 2 noiembrie 2007 16:12:35
Problema Indep Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include <cstring>

#define Nmax 1024
#define Lmax 128
#define BASE 10

int n, m = 1000;
int d[2][Nmax][Lmax];
int sir[Nmax];
int unu[Lmax];

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

void citire()
{
	int i;

	scanf("%d\n", &n);
	for (i = 1; i <= n; ++i)
		scanf("%d\n", &sir[i]);
}

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 solve()
{
	int i, j, step = 0;
    unu[0] = unu[1] = 1;

	for (j = 1; j <= n + 1; ++j, step = !step)
	{
		memcpy(d[!step], d[step], sizeof(d[step]));

		for (i = 1; i <= m; ++i)
			ADD(d[!step][gcd(sir[j], i)], d[step][i]);
		ADD(d[!step][sir[j]], unu);
	}

	if (d[!step][1][0] == 0)
		printf("0\n");
	for (i = d[!step][1][0]; i >= 1; --i)
		printf("%d", d[!step][1][i]);
}

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

	citire();
	solve();

	return 0;
}