Cod sursa(job #126241)

Utilizator gicagica popescu gica Data 21 ianuarie 2008 18:52:57
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>


int n,a[600],b[600][1100][50],m,c[50],cm,x,e[50],f[50];

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[50],int b[50])
{
	int i,t=0;
	//for (i=1; i<=c[0]; ++i) c[i]=0;
	i=0;
	//c[0]=0;
	while (t>0 || i<a[0] || i<b[0])
	{
		++i;
		a[i]=(t+b[i]+a[i])%10;
		t=a[i]/10;
		if (i>a[0]) a[0]=i;
	}
}

int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	int i,j;
	scanf("%d",&n);
	for (i=1; i<=n; ++i) 
	{
		scanf("%d",&a[i]);
		if (m<a[i]) m=a[i];
	}
	b[1][a[1]][0]=1;
	b[1][a[1]][1]=1;
	for (i=2; i<=n; i++) 
	{
        b[i][a[i]][0]=1;
		b[i][a[i]][1]=1;
		for (j=0; j<=m; j++) 
		{
			cm=cmmdc(j,a[i]);
			add(b[i][j],b[i-1][j]);
			//b[i][j]+=b[i-1][j];
			add(b[i][cm],b[i-1][j]);
			//b[i][cm]+=b[i-1][j];
		}
	}
	for (i=b[n][1][0]; i>0; --i) printf("%d",b[n][1][i]);
	
	//printf("%d",b[n][1]);
	return 0;
}