Cod sursa(job #61613)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 20 mai 2007 01:01:53
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#define fin  "indep.in"
#define fout "indep.out"
#define Nmax 501
#define Dmax 1001
#define Cmax 51

int N,ret[Cmax],v1[Dmax][Cmax],v2[Dmax][Cmax];

inline int gcd(int a,int b) {
	if (b==0)
		return a;
	else
		return gcd(b,a%b);
}

inline void add(int A[],int B[]) {
int i,t=0;
	for (i=1;i<=A[0] || i<=B[0] || t;++i) {
		if (i>A[0])
			A[i]=0;
		if (i>B[0])
			B[i]=0;
		A[i]+=B[i]+t;
		
		if (A[i]>9) {
			t=1;
			A[i]%=10;
		}
		else
			t=0;
	}

	A[0]=i-1;
}

void print(int A[]) {
int i;
	for (i=A[0];i>0;--i)
		printf("%d",A[i]);
	printf("\n");
}

int main() {
int i,j,k,x,tmp;
int aux[Cmax];
 	
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d",&N);

	aux[0]=aux[1]=1;
	ret[0]=1;

	for (i=1;i<=N;++i) {
		scanf("%d",&x);
		for (j=1;j<Dmax;++j) {
			v2[j][0]=0;
			add(v2[j],v1[j]);
		}

		for (j=1;j<Dmax;++j) {
		       	tmp=gcd(j,x);
	         	if (tmp!=x)
				add(v2[tmp],v1[j]);
		}

		add(v2[x],aux);
		
		add(ret,v2[1]);

		for (j=1;j<Dmax;++j) {
			v1[j][0]=0;
			add(v1[j],v2[j]);
		}
	}

	print(v1[1]);

	fclose(stdin); fclose(stdout);

	return 0;
}