Cod sursa(job #494631)

Utilizator joli94Apostol Adrian Alexandru joli94 Data 22 octombrie 2010 13:06:20
Problema Indep Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>
#include<cstring>
const int N = 1<<10;
int MAX = -1 , n , d, a[2][N][500] , v[N] , unu[1];

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

void read()
{
	freopen ( "indep.in" , "r" , stdin );
	freopen ( "indep.out" , "w" , stdout );
	scanf("%d" , &n);
	for (int i=1 ; i<=n ; ++i )
	{
		scanf ( "%d" , &v[i] );
		if (v[i]>MAX) MAX = v[i];
	}
}
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;
}

void afis()
{
	for(int i=a[n&1][1][0] ; i>0 ; --i)
		printf("%d",a[n&1][1][i]);
}

void solve()
{
	a[1][v[1]][0] = a[1][v[1]][1] = 1;
	unu[0] = unu[1] = 1;
	for (int i=2 ; i<=n ; ++i )
	{
		for(int j=1 ; j<=MAX ; ++j)
			memset(a[i&1][j],0,500*sizeof(int));
		for (int j=1 ; j<=MAX ; ++j )
		{
			if (a[(i-1)&1][j] != 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);
	}
	if (a[n&1][1][0]!=0) afis();
	else printf("0" );
}

int main()
{
	read();
	solve();
	return 0;
}