Cod sursa(job #325536)

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

using namespace std;

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

#define Baza 1000000000

int v[1010];
int n,Cnt[1010][1010][2],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[j][0][ind],Cnt[l][0][ind^1]);
	
	for (i=1;i<=m;++i)
		 Cnt[l][i][ind^1]+=Cnt[j][i][ind];
	for (i=1;i<=m;++i)
	{
		 Cnt[l][i+1][ind^1]+=(Cnt[l][i][ind^1]/Baza);
		 Cnt[l][i+1][ind^1]%=Baza;
	}
	Cnt[l][0][ind^1]=m;
    if (Cnt[l][m+1][ind^1])
        Cnt[l][0][ind^1]++;
}

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

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[v[1]][0][ind]=1;
	Cnt[v[1]][0][ind^1]=1;
	
	for (i=1;i<n;++i)
	{
		//memset(Cnt,0,sizeof(Cnt));
		for (j=1;j<=1000;++j)
		{
			memset(Cnt,0,sizeof(Cnt));
            Cnt[j][0][ind^1]=1;
		}
		Cnt[v[i+1]][1][ind^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;
}