Cod sursa(job #61619)

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

int N,ret,v[Nmax],cnt2[Dmax][Cmax],cnt1[Dmax][Cmax];

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

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,tmp,lim;
int aux[Cmax];
 	
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d",&N);
	
	lim=0;

	for (i=1;i<=N;++i) {
		scanf("%d",&v[i]);
		if (v[i]>lim)
			lim=v[i];
	}

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

	for (i=1;i<=N;++i) {

		for (j=1;j<=lim;++j) {

		       	tmp=gcd(j,v[i]);
			
			add(cnt2[tmp],cnt1[j]); //cnt[i][tmp]+=cnt[i-1][j];
		
		}
		
		for (j=1;j<=lim;++j) {
			tmp=gcd(j,v[i]);
			add(cnt2[j],cnt1[j]);
		}	

		add(cnt2[v[i]],aux); //cnt[i][v[i]]++;

		for (j=1;j<=lim;++j) {
			cnt1[j][0]=1; cnt1[j][1]=0; 
			add(cnt1[j],cnt2[j]);
			cnt2[j][0]=0;
		}
	}

//	for (j=1;j<10;++j) {
//	for (i=1;i<=N;++i) 
///		fprintf(stderr,"%d ",cnt[i][j]);
//	fprintf(stderr,"\n");}

	print(cnt1[1]);
	
	fclose(stdin); fclose(stdout);

	return 0;
}