Cod sursa(job #507512)

Utilizator mihai995mihai995 mihai995 Data 6 decembrie 2010 11:59:00
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <fstream>
using namespace std;

int v[1<<9],n;
short int a[2][1<<10][1<<8],unu[1<<8];

ifstream in("indep.in");
ofstream out("indep.out");

void add(short int a[],short int b[])
{
	int i,t=0;
	for (i=1;i<=a[0] || i<=b[0] || t;i++,t/=10)
		a[i]=(t+=a[i]+b[i])%10;
	a[0]=i-1;
}

void scrie(short int v[])
{
	if (!v[0])
		out<<"0\n";
	for (int i=v[0];i;i--)
		out<<(int)v[i];
	out<<"\n";
}

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

int main()
{
	int i,j,maxim=1000;
	in>>n;
	for (i=1;i<=n;i++)
		in>>v[i];
	unu[0]=unu[1]=1;
	a[1][v[1]][0]=a[1][v[1]][1]=1;
	for (i=2;i<=n;i++)
	{
		memset(a[i&1],0,sizeof(a[i&1]));
		for (j=1;j<maxim;j++)
			add(a[i&1][cmmdc(j,v[i])],a[(i-1)&1][j]);
		add(a[i&1][v[i]],unu);
		for (j=1;j<maxim;j++)
			add(a[i&1][j],a[(i-1)&1][j]);
	}
	scrie(a[n&1][1]);
	return 0;
}