Cod sursa(job #500288)

Utilizator Teodor94Teodor Plop Teodor94 Data 11 noiembrie 2010 20:43:08
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
// mat[i][j]=cate subsiruri se pot forma din primele i cu cmmdc j
#include<cstdio>

const int N=505;

int n,a[N],mat[3][2*N][50],vector1[2];

void citire()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;++i)
		scanf("%d",&a[i]);
}

int cmmdc(int x,int y)
{
	int r;
	while (y)
	{
		r=x%y;
		x=y;
		y=r;
	}
	return x;
}

void suma(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;
}

void dinamica()
{
	int x;
	mat[1][a[1]][1]=1;
	mat[1][a[1]][0]=1;
	vector1[0]=1;
	vector1[1]=1;
	for (int i=2;i<=n;++i)
	{
		for (int j=1;j<=1000;++j)
		{
			if (mat[(i-1)&1][j][0]==0)
				continue;
			x=cmmdc(j,a[i]);
			suma(mat[i&1][x],mat[(i-1)&1][j]);
		}
		suma(mat[i&1][a[i]],vector1);
		for(int j=1;j<=1000;++j)
			suma(mat[i&1][j],mat[(i-1)&1][j]);
	}
	for (int i=mat[n&1][1][0];i>0;--i)
		printf("%d\n",mat[n&1][1][i]);
}

int main()
{
	citire();
	dinamica();
	return 0;
}