Cod sursa(job #551234)

Utilizator loginLogin Iustin Anca login Data 10 martie 2011 15:55:47
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <iostream>
# define DIM 1024
# define B 1000000000
using namespace std;
int n, v[DIM], d[1000][DIM][DIM/16], nmax;

void read ()
{
	ifstream fin ("indep.in");
	fin>>n;
	for(int i=1;i<=n;++i)
	{
		fin>>v[i];
		if (v[i]>nmax)
			nmax=v[i];
	}
}

void aduna (int s[], int a[])
{
	int q, t=0, ui;
	if (s[0]<a[0])for(int i=s[0]+1;i<=a[0];++i)s[i]=0;
	if (a[0]<s[0])for(int i=a[0]+1;i<=s[0];++i)a[i]=0;	
	for(int i=1;i<=s[0] || i<=a[0];++i)
	{
		q=s[i]+a[i]+t;
		s[i]=q%B;
		t=q/B;
		ui=i;
	}
	s[0]=ui;
	while (t)
	{
		s[++s[0]]=t%B;
		t/=B;
	}
}

int cmmdc (int x, int y)
{
	int r;
	do{
		r=x%y;
		x=y;
		y=r;
	}
	while (r);
	return x;
}

void din ()
{
	int p=1, dc;
	d[1][v[1]][1]=d[1][v[1]][0]=1;
	for(int i=2;i<=n;++i)
	{
		p=1-p;
		for(int j=1;j<=nmax;++j)
			d[p][j][0]=1, d[p][j][1]=0;
		d[p][v[i]][1]=1;
		for(int j=1;j<=nmax;++j)
		{
			dc=cmmdc(v[i],j);
			aduna(d[p][dc],d[1-p][j]);
			if (j!=dc)
				aduna(d[p][dc],d[1-p][dc]);
		}		
	}
}

void write ()
{
	ofstream fout ("indep.out");
	fout<<d[n%2][1][d[n%2][1][0]];
	for(int i=d[n%2][1][0]-1;i;--i)
	{
		int x;
		x=d[n%2][1][i];
		while (x*10<B)
		{
			fout<<"0";
			x*=10;
		}
		fout<<d[n%2][1][i];
	}
}
		
int main ()
{
	read (); 
	din();
	ofstream fout ("indep.out");
	write ();
	return 0;
}