Cod sursa(job #181464)

Utilizator razvi9Jurca Razvan razvi9 Data 18 aprilie 2008 13:08:48
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>
#include<cstring>
int n,a[501],i,j,prev,now,x;
typedef int big[100];
const int baza=1000000000;
big s[2][1001],aux;
inline void add(big a,big b,big c)
{
	int i;
	memset(c,0,sizeof(big));
	if(a[0]>b[0]) c[0]=a[0];
	else c[0]=b[0];
	for(i=1;i<=c[0];i++)
		c[i]=a[i]+b[i];
	for(i=1;i<=c[0];i++)
		if(c[i]>=baza)
		{
			c[i+1]++;
			c[i]-=baza;
		}
	if(c[c[0]+1]) c[0]++;
}
inline void increment(big a)
{
	if(a[0]==0)
	{
		a[0]=1;
		a[1]=1;
	}
	else
	{
		a[1]++;
		int i=1;
		while(a[i]>=baza)
		{
			a[i+1]++;
			a[i]-=baza;
			i++;
		}
		if(a[a[0]+1]) a[0]++;
	}
}
inline int cmmdc(int a,int b)
{
	int r;
	while(a!=0)
	{
		r=b%a;
		b=a;
		a=r;
	}
	return b;
}
inline void print(big a)
{
	int i,j;
	printf("%d",a[a[0]]);
	for(i=a[0]-1;i>0;--i)
	{
		j=baza/10;
		while(a[i]/j==0 && j>1){printf("0");j/=10;}
		printf("%d",a[i]);
	}
	printf("\n");
}
int main()
{
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	now=0;
	increment(s[now][a[1]]);
	for(i=2;i<=n;i++)
	{
		prev=now;
		now=!now;
		for(j=1;j<=6;j++)
		{
			memcpy(s[now][j],s[prev][j],sizeof(big));
			x=cmmdc(a[i],j);
			add(s[now][x],s[prev][j],aux);
			memcpy(s[now][x],aux,sizeof(big));
		}
		increment(s[now][a[i]]);
	}
	print(s[now][1]);
	fclose(stdout);
	return 0;
}