Cod sursa(job #124129)

Utilizator marius135Dumitran Adrian Marius marius135 Data 18 ianuarie 2008 12:20:00
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
#include<string.h>

#define baza 1000000000
#define max 62
long nr[1024];
short cmmd[1024][1024];
long t[1024][64];
long v[1024][64];


long cmmdc(long a,long b)
{
	while(b)
	{
		long c = a % b;
		a = b;
		b = c;
	}
	return a;
}
void add(long *a, long *b)
{
	long i;
	if(a[0] == 0)
		a[0] = b[0] ;
	if( a[0] > b[0] )
		a[0] = b[0];
	if( b[0] == 0) return ;
	for( i = max; i >= a[0] || a[i+1] > baza; i--)
	{
		a[i]+=b[i] + a[i+1]/baza;
		a[i+1]%=baza;
	}
	a[0] = i+1;
	
}
void afisare(long *a)
{
	printf("%ld",a[a[0]]);
	for(long i = a[0]+1; i <= max;i++)
		printf("%09ld",a[i]);
}


int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	
	long i,j,n;
	scanf("%ld",&n);
	
	for( i = 1; i <= n; ++i)
	{
		scanf("%ld",&nr[i]);
	}
	for( i = 1; i <= 1000 ; i++)
		for( j = i ; j <= 1000 ; ++j)
			cmmd[i][j] = cmmd[j][i] = cmmdc(j,i);
	
	for( i = 1; i <= n; i++)
	{
		memset(t,0,sizeof(t));
		t[ nr[i] ][max]  = 1;
		t[ nr[i] ][0] = max;
		for( j = 1; j <= 1000; ++j)
		{
			if(v[j][0] == 0) continue;
			add( t[cmmd[nr[i]][j]],v[j]);
		}
		for( j = 1; j <= 1000; ++j)
			add(v[j],t[j]);
		
	}
	afisare(v[1]);
	
	return 0;
}