Cod sursa(job #126488)

Utilizator gicagica popescu gica Data 22 ianuarie 2008 12:49:45
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>


int n,a[600],b[2][1100][400],m,c[400],cm,x;

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

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 main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	int i,j,p = 1;
	scanf("%d",&n);
	for (i=1; i<=n; ++i) 
	{
		scanf("%d",&a[i]);
		if (m<a[i]) m=a[i];
	}
	if (n==1) 
	{
		if (a[1]>1) printf("%d",0);
		else printf("%d",1);
		return 0;
	}
	b[p^1][a[1]][0]=1;
	b[p^1][a[1]][1]=1;
	for (i=2; i<=n; i++) 
	{
		for (j=0; j<=m; j++)
		{
			for (int k=1; k<=b[p][j][0]; k++)
			{
			b[p][j][k] = 0;
			}
			b[p][j][0] = 0;
		}
        b[p][a[i]][0]=1;
		b[p][a[i]][1]=1;

		for (j=0; j<=m; j++) 
		{
			cm=cmmdc(j,a[i]);
			add(b[p][j],b[p^1][j]);
			//b[i][j]+=b[i-1][j];
			add(b[p][cm],b[p^1][j]);
			//b[i][cm]+=b[i-1][j];
		}
	p ^= 1;
	}
	for (i=b[p^1][1][0]; i>0; --i) printf("%d",b[p^1][1][i]);
	
	//printf("%d",b[n][1]);
	return 0;
}