Cod sursa(job #126795)

Utilizator savimSerban Andrei Stan savim Data 22 ianuarie 2008 20:39:29
Problema Indep Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
long l,i,j,k,n;
long a[501];
unsigned long din[2][1001][51];
void add(int p, int q,int r, int t)
{
	 int i,tr=0;
	 for (i=50; i>=1; i--)
	 {
		 din[p][q][i]+=din[r][t][i]+tr;
		 tr=din[p][q][i]/10000000;
		 din[p][q][i]%=10000000;
	 }
}
long cmmdc(long x, long y)
{
	int a=x,b=y,r;

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

	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);

	scanf("%ld",&n);
	for (i=1; i<=n; i++)
		 scanf("%ld",&a[i]);
	
    //fac dinamica
	l=0;
	for (i=1; i<=n; i++)
	{
		l=1-l;
		din[l][a[i]][50]++;
		if (l==1)
		for (j=1; j<=1000; j++)
		{
			add(1,j,0,j);
			add(1,cmmdc(j,a[i]),0,j);
			int o;
			for (o=1; o<=50; o++)
				din[0][j][o]=0;
		}
		else
		for (j=1; j<=1000; j++)
		{
			add(0,j,1,j);
			add(0,cmmdc(j,a[i]),1,j);
			int o;
			for (o=1; o<=50; o++)
				din[1][j][o]=0;
		}
	}

	//afisez solutia
	j=0;
	for (i=1; i<=50; i++)
		if (din[l][1][i]!=0)
		{
		   for (j=i; j<=50; j++)
			   printf("%ld",din[l][1][j]);
		   printf("\n");
		   return 0;
		}
	printf("0\n");
	return 0;
}