Cod sursa(job #866106)

Utilizator ELHoriaHoria Cretescu ELHoria Data 27 ianuarie 2013 15:50:39
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
 
const int base = int(1e9);
int N, v[512], ans;
int dp[1024][512];
int G[1002][1002];
int one[4];

int gcd(int a,int b) {
    if(!b) return a;
    return gcd(b,a%b);
}

void add(int a[],int b[]) {
	if(a[0] > b[0]) {
		for(int i = b[0] + 1;i <= a[0];i++) {
			b[i] = 0;
		}
	} else {
		for(int i = a[0] + 1;i <= b[0];i++) {
			a[i] = 0;
		}
		a[0] = b[0];
	}
	int T = 0;
	for(int i = 1;i <= a[0];i++) {
		a[i] = a[i] + b[i] + T;
		T = a[i]/base;
		a[i] %= base;
	}
	while(T) {
		a[++a[0]] = T%base;
		T /= base;
	}
}

int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%d",&N);
	int valMax = 0;
    for(int i = 1;i <= N;++i) {
        scanf("%d",&v[i]);
		valMax = valMax > v[i] ? valMax : v[i];
	}

	for(int i = 1;i <= valMax;i++) {
		for(int j = 1;j <= i;j++) {
			G[i][j] = G[j][i] = gcd(i,j);
		}
	}

	one[0] = one[1] = 1;
	for(int i = 1;i <= N;i++) {
		for(int j = 1;j <= valMax;j++) {
		
			if(dp[j][0] > 0) {
				add(dp[G[j][v[i]]],dp[j]);
			}
		
		}
		add(dp[v[i]],one);
	}
	printf("%d",dp[1][dp[1][0]]);
	for(int j = dp[1][0] - 1;j >= 1;--j) {
		printf("%.9d",dp[1][j]);
	}
    return 0;
}