Cod sursa(job #556358)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 16 martie 2011 09:07:02
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>
#include<cstring>

int i,j,n,a[1024][1024],aux[1024][1024],cmdc[1024][1024],v[1024],k=0,unu[1024];

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

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

int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	
	scanf("%d",&n);
	
	for(i=1;i<=n;++i) 
	{
		scanf("%d",&v[i]);
		if(v[i]>k) k=v[i];
	}
		
	
	for(i=1;i<=k;++i)
		for(j=i+1;j<=k;++j)
			cmdc[i][j]=cmdc[j][i]=cmmdc(i,j);
	
	for(i=1;i<=n;++i)
	{
		int x=v[i];
		
		unu[0]=1;
		unu[1]=1;
		add(aux[x],unu);
		
		for(j=1;j<=k;++j) 
			if(a[j][0])
			{
				int cm=cmdc[j][x];
				add(aux[cm],a[j]);
			}
		for(j=1;j<=k;++j) 
			if(aux[j][0]) 
			{
				add(a[j],aux[j]);
				memset(aux[j],0,sizeof(aux[j]));
			}
	}
	if(!a[1][0]) printf("0");
	else
		for(i=a[1][0];i>0;--i) printf("%d",a[1][i]);
	printf("\n");
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}