Cod sursa(job #780054)

Utilizator maritimCristian Lambru maritim Data 19 august 2012 19:24:16
Problema Indep Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>

FILE *f = fopen("indep.in","r");
FILE *g = fopen("indep.out","w");

#define MaxN 510
#define MaxP 3
#define MaxNrMari 2000
#define MaxA 1010
#define ll long long
#define baza 10

int N;
int A[MaxN],C[3] = {1,1};
int Best[MaxA][MaxNrMari];

void citire(void)
{
	fscanf(f,"%d\n",&N);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d ",&A[i]);
}

inline int cmmdc(int a,int b)
{
	if(!b)
		return a;
	return cmmdc(b,a%b);
}

void Afisare(int Best[][MaxNrMari],int N)
{
	for(int i=1;i<=N;i++,printf(" "))
	{
		if(Best[i][0] == 0)
			printf("0");
		else for(int j=Best[i][0];j;j--)
			printf("%d",Best[i][j]);
	}
	printf("\n");
}

inline void Adunare(int A[],int B[])
{
	int aux = 0,i;
	
	for(i=1;i<=A[0] && i<=B[0];i++)
		aux = aux+A[i]+B[i],A[i] = aux%baza,aux /= baza;
		
	for(;i<=B[0];i++)
		aux = aux+B[i],A[i] = aux%baza,aux /= baza;
		
	for(;aux;i++)
		aux = aux+A[i]+B[i],A[i] = aux%baza,aux /= baza;
	
	if(A[0] < --i)
		A[0] = i;
}

void Rezolvare(void)
{
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=1000;j++)
			Adunare(Best[cmmdc(j,A[i])],Best[j]);
		Adunare(Best[A[i]],C);
		//Afisare(Best,10);
	}
}

int main()
{
	citire();
	Rezolvare();
	
	for(int i=Best[1][0];i;i--)
		fprintf(g,"%d",Best[1][i]);
	fprintf(g,"\n");
}