Pagini recente » Cod sursa (job #2094836) | Cod sursa (job #1892581) | Cod sursa (job #2645191) | Cod sursa (job #2129032) | Cod sursa (job #31877)
Cod sursa(job #31877)
#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;
}