Cod sursa(job #494628)

Utilizator Adela_BaciuAdela Baciu Adela_Baciu Data 22 octombrie 2010 12:53:46
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<cstdio>
int a[510][1010][500],v[510];
int n,unu[10];
int cmmdc(int a, int b)
{
	int r;
	while(b)
	{
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}
void Add(int A[500], int B[500])
{ 
	int i,T=0;

	if (B[0]>A[0])
    { for (i=A[0]+1;i<=B[0];) A[i++]=0;
      A[0]=B[0];
    }
    else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    { A[i]+=B[i]+T;
      T=A[i]/10;
      A[i]%=10;
    }
  if (T) A[++A[0]]=T;
}
void afisare(int A[500])
{
    for(int i=A[0];i>=1;i--)
        printf("%d",A[i]);
}
int main()
{
	int  i,j,d;
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
	a[1][v[1]][0]=a[1][v[1]][1]=1;
	unu[0]=unu[1]=1;
	for(i=2;i<=n;i++)
	{
		for(j=1;j<=1000;j++)
		{
			if(a[i-1][j][0]!=0)
			{
				d=cmmdc(j,v[i]);
				Add(a[i][d],a[i-1][j]);
			}
			Add(a[i][j],a[i-1][j]);
		}
		Add(a[i][v[i]],unu);
	}
	afisare(a[n][1]);
	return 0;
}