Cod sursa(job #494634)

Utilizator Adela_BaciuAdela Baciu Adela_Baciu Data 22 octombrie 2010 13:09:35
Problema Indep Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#include<cstring>
int a[510][1010][500],v[510];
int n,unu[500];
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("%d",&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++)
			memset(a[i&1][j],0,500*sizeof(int));
		for(j=1;j<=1000;j++)
		{
			if(a[(i-1)&1][j][0]!=0)
			{
				d=cmmdc(j,v[i]);
				Add(a[i&1][d],a[(i-1)&1][j]);
			}
			Add(a[i&1][j],a[(i-1)&1][j]);
		}
		Add(a[i&1][v[i]],unu);
	}
	afisare(a[n&1][1]);
	return 0;
}