Cod sursa(job #325539)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 iunie 2009 00:37:05
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define file_in "indep.in"
#define file_out "indep.out"

#define Baza 1000000000

int v[510];
int n,Cnt[2][1010][50],ind,i,j;

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

void adunare(int l)
{
	//int i;
	int m=max(Cnt[ind][j][0],Cnt[ind^1][l][0]);
	
	for (i=1;i<=m;++i)
		 Cnt[ind^1][l][i]+=Cnt[ind][j][i];
	for (i=1;i<=m;++i)
	{
		 Cnt[ind^1][l][i+1]+=(Cnt[ind^1][l][i]/Baza);
		 Cnt[ind^1][l][i+1]%=Baza;
	}
	Cnt[ind^1][l][0]=m;
    if (Cnt[ind^1][l][m+1])
        Cnt[ind^1][l][0]++;
}

void afisare()
{
	//int i;
	printf("%d", Cnt[ind][1][Cnt[ind][1][0]]);
    for (i=Cnt[ind][1][0]-1;i>=1;--i)
         printf("%09d", Cnt[ind][1][i]);
}

int main()
{
	//int i,j;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &n);
	for (i=1;i<=n;++i)
		 scanf("%d", &v[i]);
	
    /*Cnt[1][v[1]]=1;
	for (i=1;i<n;++i)
	{
		Cnt[i+1][v[i+1]]++;
		for (j=1;j<=1000;++j)
		{
			Cnt[i+1][j]+=Cnt[i][j];
	        Cnt[i+1][cmmdc(j,v[i+1])]+=Cnt[i][j]; 
		}
	}*/
	
	ind=0;
	Cnt[ind][v[1]][0]=1;
	Cnt[ind][v[1]][1]=1;
	
	for (i=1;i<n;++i)
	{
		//memset(Cnt,0,sizeof(Cnt));
		for (j=1;j<1000;++j)
		{
			memset(Cnt[ind^1][j],0,50*sizeof(int));
            Cnt[ind^1][j][0]=1;
		}
		Cnt[ind^1][v[i+1]][1]=1;
		for (j=1;j<1000;++j)
		{
			adunare(j);
			adunare(cmmdc(j,v[i+1]));
		}
	
		ind^=1;
	}

	//printf("%lld", Cnt[n][1]);
	afisare();
	
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}