Pagini recente » Cod sursa (job #2624091) | Cod sursa (job #2714362) | Cod sursa (job #1505454) | Cod sursa (job #3291110) | Cod sursa (job #502187)
Cod sursa(job #502187)
#include<cstdio>
const int N=100;
int A[N][N],B[N][N],C[N],x[N];
int ONE[2];
int lim,n;
void citeste()
{
int i;
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;++i)
{
scanf("%d",&x[i]);
if (lim>x[i])
lim=x[i];
}
}
int cmmdc(int a,int b)
{
int r;
while (b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
void rastoarna()
{
int aux,st=1,dr=C[0];
while (st<dr)
{
aux=C[st];
C[st]=C[dr];
C[dr]=aux;
st++;--dr;
}
}
void aduna(int d,int j)
{
//adun in B[d] pe A[j]
int t,k;
if (A[j][0]>B[d][0])
B[d][0]=A[j][0];
else
A[j][0]=B[d][0];
t=0;
for (k=A[j][0];k>=1;--k)
{
C[A[j][0]-k+1]=(A[j][k]+B[d][k]+t)%10;
t=(A[j][k]+B[d][k]+t)/10;
}
C[0]=A[j][0];
if (t)
C[++C[0]]=t;
rastoarna();
for (k=0;k<=C[0];++k)
B[d][k]=C[k];
}
void aduna1(int d)
{
//adun in B[d] pe ONE
int t,k;
if (ONE[0]>B[d][0])
B[d][0]=ONE[0];
else
ONE[0]=B[d][0];
t=0;
for (k=ONE[0];k>=1;--k)
{
C[ONE[0]-k+1]=(ONE[k]+B[d][k]+t)%10;
t=(ONE[k]+B[d][k]+t)/10;
}
C[0]=ONE[0];
if (t)
C[++C[0]]=t;
rastoarna();
for (k=0;k<=C[0];++k)
B[d][k]=C[k];
}
void pune()
{
int i,j;
for (i=1;i<=lim;++i)
{
for (j=0;j<=B[i][0];++j)
A[i][j]=B[i][j];
B[i][0]=0;
}
}
void rezolva()
{
int i,j,d;
ONE[0]=1;
ONE[1]=1;
A[x[1]][0]=1;
A[x[1]][1]=1;
for (i=2;i<=n;++i)
{
for (j=1;j<=lim;++j)
{
d=cmmdc(j,x[i]);
aduna(d,j);
}
aduna1(x[i]);
for (j=1;j<=lim;++j)
aduna(j,j);
pune();
}
for (i=1;i<=A[1][0];++i)
printf("%d",A[x[n]][i]);
}
int main()
{
citeste();
rezolva();
return 0;
}