Cod sursa(job #120)

Utilizator wefgefAndrei Grigorean wefgef Data 5 decembrie 2006 14:06:51
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <string.h>

using namespace std;

#define Nmax 512
#define Rmax 1024

typedef int Huge[128];

const int base = 1000000000;
int n, v[Nmax];
Huge a[Rmax], b[Rmax], unu;

void readdata()
{
	freopen("indep.in", "r", stdin);
	freopen("indep.out", "w", stdout);
	
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &v[i]);
}

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

void add(Huge A, Huge 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, val;
	
	unu[0] = 1; unu[1] = 1;
	for (i = 1; i <= n; ++i)
	{
		add(b[v[i]], unu);
		for (j = 1; j < Rmax; ++j)
			if (a[j][0])
			{
				val = cmmdc(v[i], j);
				add(b[val], a[j]);
			}
		
		for (j = 1; j < Rmax; ++j)
			add(a[j], b[j]);
		memset(b, 0, sizeof(b));
	}
	if (a[1][0] == 0) { printf("0"); return; }
	printf("%d", a[1][a[1][0]]);
	for (i = a[1][0]-1; i; --i)
	{
		if (a[1][i] < 100000000) printf("0");
		if (a[1][i] < 10000000) printf("0");
		if (a[1][i] < 1000000) printf("0");
		if (a[1][i] < 100000) printf("0");
		if (a[1][i] < 10000) printf("0");
		if (a[1][i] < 1000) printf("0");
		if (a[1][i] < 100) printf("0");
		if (a[1][i] < 10) printf("0");
		printf("%d", a[1][i]);
	}
}

int main()
{
	readdata();
	solve();
	return 0;
}