Cod sursa(job #502187)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 18 noiembrie 2010 10:05:35
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<cstdio>

const int N=100;

int A[N][N],B[N][N],C[N],x[N];
int ONE[2];
int lim,n;

void citeste()
{
	int i;
	
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	
	scanf("%d",&n);
	for (i=1;i<=n;++i)
		{
			scanf("%d",&x[i]);
			if (lim>x[i])
				lim=x[i];
	    }
}

int cmmdc(int a,int b)
{
	int r;
	while (b)
	{
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}

void rastoarna()
{
	int aux,st=1,dr=C[0];
	while (st<dr)
	{
		aux=C[st];
		C[st]=C[dr];
		C[dr]=aux;
		st++;--dr;
	}
}

void aduna(int d,int j)
{
//adun in B[d] pe A[j]
	int t,k;
	if (A[j][0]>B[d][0])
		B[d][0]=A[j][0];
	else
		
		A[j][0]=B[d][0];
	
	t=0;
	for (k=A[j][0];k>=1;--k)
	{
		C[A[j][0]-k+1]=(A[j][k]+B[d][k]+t)%10;
		t=(A[j][k]+B[d][k]+t)/10;
	}
	
	C[0]=A[j][0];
	if (t)
		C[++C[0]]=t;
	rastoarna();
	for (k=0;k<=C[0];++k)
		B[d][k]=C[k];
	
}

void aduna1(int d)
{
	//adun in B[d] pe ONE
	int t,k;
	if (ONE[0]>B[d][0])
		B[d][0]=ONE[0];
	else
		ONE[0]=B[d][0];
	
	t=0;
	for (k=ONE[0];k>=1;--k)
	{
		C[ONE[0]-k+1]=(ONE[k]+B[d][k]+t)%10;
		t=(ONE[k]+B[d][k]+t)/10;
	}
	
	C[0]=ONE[0];
	if (t)
		C[++C[0]]=t;
	rastoarna();
	for (k=0;k<=C[0];++k)
		B[d][k]=C[k];
}

void pune()
{
	int i,j;
	for (i=1;i<=lim;++i)
		{
			for (j=0;j<=B[i][0];++j)
				A[i][j]=B[i][j];
			B[i][0]=0;
		}
	
	
}
void rezolva()
{
	int i,j,d;
	
	ONE[0]=1;
	ONE[1]=1;
	
	A[x[1]][0]=1;
	A[x[1]][1]=1;
	
	for (i=2;i<=n;++i)
	{
		for (j=1;j<=lim;++j)
		{
			d=cmmdc(j,x[i]);
			aduna(d,j);
		}
		
		aduna1(x[i]);
		
		for (j=1;j<=lim;++j)
			aduna(j,j);
		pune();
	}
	
	for (i=1;i<=A[1][0];++i)
		printf("%d",A[x[n]][i]);
}

int main()
{
	citeste();
	rezolva();
	
	return 0;
}