Cod sursa(job #975249)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 19 iulie 2013 15:46:55
Problema Indep Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<fstream>
#include<cstdio>
using namespace std;
int n,v[510],valmax;
int nr[2][1010][1010],gcd[1010][1010],unu[1010];

inline void Adunare(int A[],int B[])
{
	int i,t=0;
	for(i=1;i<=A[0] || i<=B[0] || t;i++,t/=1000000000)
		A[i]=(t+=A[i]+B[i])%1000000000;
	A[0]=i-1;
}

inline void Memset(int A[])
{
	int i;
	for(i=A[0];i>=0;i--)
		A[i]=0;
}

inline void Copiere(int A[],int B[])
{
	int i;
	Memset(B);
	for(i=0;i<=A[0];i++)
		B[i]=A[i];
}

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

int main()
{
	int i,j;
	ifstream fin("indep.in");
	fin>>n;
	for(i=1;i<=n;i++)
	{
		fin>>v[i];
		valmax=max(valmax,v[i]);
	}
	fin.close();
	
	for(i=1;i<=valmax;i++)
		for(j=i;j<=valmax;j++)
			gcd[i][j]=gcd[j][i]=Euclid(i,j);
	unu[0]=unu[1]=1;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=valmax;j++)
		{
			Adunare(nr[1][gcd[j][v[i]]],nr[0][j]);
			Adunare(nr[1][j],nr[0][j]);
		}
		Adunare(nr[1][v[i]],unu);
		for(j=1;j<=valmax;j++)
		{
			Copiere(nr[1][j],nr[0][j]);
			Memset(nr[1][j]);
		}
	}
	
	freopen("indep.out","w",stdout);
	printf("%d",nr[0][1][nr[0][1][0]]);
	for(i=nr[0][1][0]-1;i>0;i--)
		printf("%09d",nr[0][1][i]);
	printf("\n");
	return 0;
}