Cod sursa(job #493747)

Utilizator rumburakrumburak rumburak Data 19 octombrie 2010 13:28:44
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <cstring>

const int N = 512;
const int R = 1024;
const int L = 1<<8;

int n;
short int a[2][R][L];

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

void unu(short int x[L])
{
	short int i,t=1,aux;
	for(i=1 ; i<=x[0] || t!=0 ; ++i)
	{
		aux = x[i] + t;
		t = (aux < 10 ? 0 : 1);
		x[i] = aux % 10;
	}
	x[0] = i-1;
}

void plus(short int x[L],short int y[L])
{
	short int i,t=0,aux;
	for(i=1 ; i<=x[0] || i<=y[0] || t!=0 ; ++i)
	{
		aux = x[i] + y[i] + t;
		t = (aux < 10 ? 0 : 1);
		x[i] = aux % 10;
	}
	x[0] = i-1;
}

void scrie(short int x[L])
{
	for(short int i=x[0] ; i>=1 ; --i)
		printf("%hd",x[i]);
	//printf("\n");
}

inline bool zero(short int x[L])
{
	return (x[0] == 0);
}

void linie(short int i)
{
	for(short int j=1 ; j<=6 ; ++j)
	{
		if(zero(a[i][j]))
			printf("0");
		else
			scrie(a[i][j]);
		printf("\t");
	}
	printf("\n");
}

int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	int x,d;
	scanf("%d",&n);
	for(int i=1 ; i<=n ; ++i)
	{
		scanf("%d",&x);
		unu(a[i&1][x]);
		for(int j=1 ; j<R ; ++j)
		{
			if(zero(a[1 - (i&1)][j]))
				continue;
			d = cmmdc(j,x);
			plus(a[i&1][d],a[1 - (i&1)][j]);
		}
		//linie(i&1);
		for(int j=1 ; j<R ; ++j)
		{
			plus(a[i&1][j],a[1 - (i&1)][j]);
			memset(a[1 - (i&1)][j],0,L*sizeof(short int));
		}
		//linie(i&1);
	}
	scrie(a[n&1][1]);
	return 0;
}