Cod sursa(job #96636)

Utilizator victorsbVictor Rusu victorsb Data 2 noiembrie 2007 16:20:34
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <cstring>

#define Nmax 1024
#define Lmax 32
#define BASE 1000000

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 scrie(int A[])
{
	int i;

	if (A[0] == 0)
	{
		printf("0\n");
		return;
	}

    printf("%d", A[A[0]]);
	for (i = A[0] - 1; i >= 1; --i)
		printf("%.6d", A[i]);
}

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);
	}
	
	scrie(d[!step][1]);
}

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

	citire();
	solve();

	return 0;
}