Cod sursa(job #266083)

Utilizator za_wolfpalianos cristian za_wolf Data 24 februarie 2009 21:27:35
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<stdio.h>
#define NMAX 501
#define MMAX 1001
int y[NMAX][MMAX][50],x[NMAX],i,j,n,m,k,l,a,s,rez[NMAX];
int unu[]={1,1};
void add(int A[], int B[])
{
	  int i, t = 0;
	  for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
			  A[i] = (t += A[i] + B[i]) % 10;
	  A[0] = i - 1;
}
int cmmdc(int a, int b)
{
	while(a&&b)
	{
		if (a>b)
			a%=b;
		else
			b%=a;

	}
	if (a)
		return a;
	else
		return b;

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

	add(y[1][x[1]],unu);
	for (i=2;i<=n;i++)
	{
//		y[i][x[i]]+=1;
		add(y[i][x[i]],unu);
		for (j=1;j<i;j++)
			for (l=1;l<=s;l++)
			if (y[j][l])
			{
//				y[i][cmmdc(x[i],l)]+=y[j][l];
				add(y[i][cmmdc(x[i],l)],y[j][l]);
			}
	}

	for (i=1;i<=n;i++)
		add(rez,y[i][1]);
	//	s+=y[i][1];
//	printf("%d\n",s);
	for (i=rez[0];i>=1;i--)
		printf("%d",rez[i]);
	printf("\n");



	return 0;
}