Cod sursa(job #183446)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 22 aprilie 2008 09:49:39
Problema Indep Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAX_N 510
#define MAX_M 1010

// 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]
long long Nr[2][MAX_M];
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;
}

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);
    }

	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]] += 1;
	}
	printf("%lld\n", Nr[(n-1)&1][1]);
	return 0;
}