Cod sursa(job #160838)

Utilizator alextheroTandrau Alexandru alexthero Data 16 martie 2008 23:58:03
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <string.h>

#define nmax 505
#define vmax 1005
#define lmax 105
#define baza 1000000000

int n, now;
int a[nmax], aux[lmax];
int c[2][vmax][lmax];

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 /= baza)
		A[i] = (t += A[i] + B[i]) % baza;
	A[0] = i - 1;
}

void show(int A[])
{
	printf("%d", A[A[0]]);
	for(int i = A[0] - 1; i >= 1; i--) printf("%09d", A[i]); printf("\n");
}
int main()
{
	freopen("indep.in", "r", stdin);
	freopen("indep.out", "w", stdout);
	
	scanf("%d", &n); aux[0] = aux[1] = 1;
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);

	now = 0;
	for(int i = 0; i <= 1000; i++) c[1][i][0] = 1, c[1][i][1] = 0;
	for(int i = 1; i <= n; i++)
	{
		now = !now;
		add(c[now][a[i]], aux);
		if(i == n) break;
		for(int j = 0; j <= 1000; j++) 
		{
			memset(c[!now][j], 0, sizeof(c[!now][j]));
			c[!now][j][0] = 1, c[!now][j][1] = 0;
		}
		for(int j = 0; j <= 1000; j++)
			if(c[now][j] != 0) 
			{
				add(c[!now][j], c[now][j]);
				add(c[!now][cmmdc(j, a[i + 1])], c[now][j]);
			}
	}

	show(c[now][1]);
	return 0;
}