Cod sursa(job #5148)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 10 ianuarie 2007 19:52:09
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
# include <stdio.h>

const int NRMAXLEN=200;
typedef int NUMAR[NRMAXLEN+1];
NUMAR c[1000+1];
int n;

int cmmdc(int a, int b)
{
int r;
if (a<b) {r=b;b=a;a=r;}
r=a%b;
while (r) {a=b;b=r;r=a%b;}
return b;
}

void inmulteste_2_c(int k)
{
int i;
for (i=1;i<=c[k][0];i++) c[k][i]*=2;
i=1;
while (c[k][i]>0||i<=c[k][0])
	if (c[k][i]>=10) {c[k][i+1]++;c[k][i]-=10;i++;}
	else i++;
if (i-1>c[k][0]) c[k][0]=i-1;
}

void incrementeaza_c(int k)
{
int i;
c[k][1]++;i=1;
while (c[k][i]>=10) {c[k][i+1]++;c[k][i]-=10;i++;}
if (i>c[k][0]) c[k][0]=i;
}

void aduna_c(int dest, int sursa)
{
int i=1;
while (i<=c[sursa][0]) {c[dest][i]+=c[sursa][i];i++;}
if (c[dest][0]<c[sursa][0]) c[dest][0]=c[sursa][0];
i=1;
while (c[dest][i]>0||i<=c[dest][0])
	if (c[dest][i]>=10) {c[dest][i+1]++;c[dest][i]-=10;i++;}
	else i++;
if (i-1>=c[dest][0]) c[dest][0]=i-1;
}

void compute()
{
FILE *f=fopen("indep.in","r");
fscanf(f,"%d",&n);int i,j,x,cm;
for (i=1;i<=n;i++)
	{
	fscanf(f,"%d",&x);
	//incrementeaza_c(x);
	for (j=1;j<=10;j++) //AICI!!!! 1000
		if (c[j][0])
			{
			cm=cmmdc(x,j);
			if (cm==j) {inmulteste_2_c(j);}
			else if (cm==x) {aduna_c(cm,j);}
			else {aduna_c(cm,j);}
			}
	incrementeaza_c(x);
	}
fclose(f);
}

void scrie()
{
FILE *g=fopen("indep.out","w");
int i;
for (i=c[1][0];i>=1;i--) fprintf(g,"%d",c[1][i]);
fprintf(g,"\n");
fclose(g);
}

int main()
{
compute();
scrie();
return 0;
}