Cod sursa(job #31877)

Utilizator butyGeorge Butnaru buty Data 16 martie 2007 20:43:54
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>
#define sc scanf
#define pr printf
struct lista
{
	int inf;
	lista *urm;
};
const int Nmax=1024;
long long N,A[Nmax],M[Nmax][Nmax],V[Nmax],SUM;
lista *E[Nmax];
void cit()
{
	int i;
	freopen("indep.in","r",stdin);
	sc("%d",&N);
	for(i=1;i<=N;i++)
		sc("%d",&A[i]);
}
int cmmdc(int a,int b)
{
	int r;
	if(a<b)
	{
		r=a;
		a=b;
		b=r;
	}
	while(b)
	{
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}
void rez()
{
	int i,j,dc;
	lista *c,*D[Nmax];
	for(i=1;i<=N;i++)
	{
		E[i]=new lista;
		E[i]->urm=NULL;
		D[i]=E[i];
	}
	for(i=2;i<=N;i++)
		for(j=1;j<i;j++)
		{
			dc=cmmdc(A[i],A[j]);
			if(dc==1)
				V[i]+=V[j]+1;
			else
				V[i]+=V[j];
			if(M[i][dc]==0&&dc!=1)
			{
				D[i]->urm=new lista;
				D[i]=D[i]->urm;
				D[i]->inf=dc;
				D[i]->urm=NULL;
				M[i][dc]=1;
			}
			for(c=E[j]->urm;c;c=c->urm)
			{
				dc=cmmdc(A[i],c->inf);
				if(dc!=1)
				{
					if(M[i][dc]==0)
					{
						D[i]->urm=new lista;
						D[i]=D[i]->urm;
						D[i]->inf=dc;
						D[i]->urm=NULL;
						M[i][dc]=M[j][c->inf];
					}
					else
						M[i][dc]+=M[j][c->inf];
				}
				else
					V[i]+=M[j][c->inf];
			}
		}
	for(i=1;i<=N;i++)
		SUM+=V[i];
}
void scr()
{
	freopen("indep.out","w",stdout);
	pr("%d\n",SUM);
	fclose(stdout);
}
int main()
{
	cit();
	rez();
	scr();
	return 0;
}