Cod sursa(job #183450)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 22 aprilie 2008 09:58:51
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAX_N 510
#define MAX_M 1010
#define MAX_C 100
#define BASE 1000000
#define FORMAT "%06d"

struct numar {
	int cf[MAX_C];
	void operator=(int a) {
		for ( cf[0] = 1; a; a/=BASE, cf[0]++ )
			cf[cf[0]] = a%BASE;
		cf[0] --;
	}
	void operator=(numar b) {
		memcpy(cf, b.cf, sizeof(int)*(b.cf[0]+1));
	}
	void operator+=(numar b) {
		int i, t=0;
		for ( i=1; i<=cf[0] || i<=b.cf[0] || t; ++i, t/=BASE )
			cf[i] = ( t+= cf[i]+b.cf[i] ) % BASE;
		cf[0] = i-1;
	}
};

// Nr[x][y] = nr de subsiruri din primele x nr din sir care au cmmdc == y
// Nr[x][cmmdc(y, A[x])] += Nr[x-1][y]
numar Nr[2][MAX_M], un;
int A[MAX_N];
int n,i,j,mx;

int cmmdc(int a, int b) {
	if ( a<b ) swap(a, b);
	int r;
	while ( b ) {
		r = a%b; a = b; b = r;
	}
	return a;
}

void print(numar a) {
	printf("%d", a.cf[a.cf[0]]);
	for (i=a.cf[0]-1; i>0; --i)
		printf(FORMAT, a.cf[i]);
}

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

	scanf("%d", &n);
	for ( i=0; i<n; ++i ) {
    	scanf("%d", A+i);
        mx = max(A[i],mx);
    }

	un = 1;
	Nr[0][A[0]] = 1;
	for ( i=1; i<n; ++i ) {
		int a1 = i&1, a2 = !a1;
		for ( j=1; j<=mx; ++j ) {
			Nr[a1][j] = Nr[a2][j];
			int x = cmmdc(j,A[i]);
			Nr[a1][x] += Nr[a2][j];
		}
		Nr[a1][A[i]] += un;
	}
	print(Nr[(n-1)&1][1]); printf("\n");
	return 0;
}