Pagini recente » Cod sursa (job #1306641) | Cod sursa (job #2143908) | Cod sursa (job #1854896) | Cod sursa (job #3158292) | Cod sursa (job #500290)
Cod sursa(job #500290)
#include<cstdio>
typedef int Huge[1<<10];
int MAX,n,a[1<<9];
Huge unu,d[2][1<<10];
void read()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>MAX)
MAX=a[i];
}
}
int cmmdc(int x,int y)
{
int r=x%y;
while(r)
{
x=y;
y=r;
r=x%y;
}
return y;
}
void reset(Huge v[1<<10])
{
for(int i=1;i<=MAX;i++)
v[i][0]=0;
}
void adun(Huge A,Huge B)
{
int i,T=0;
if(B[0]>A[0])
{
for(i=A[0]+1;i<=B[0];)
A[i++]=0;
A[0]=B[0];
}
else for(i=B[0]+1;i<=A[0];) B[i++]=0;
for(i=1;i<=A[0];i++)
{
A[i]+=B[i]+T;
T=A[i]/10;
A[i]%=10;
}
if(T) A[++A[0]]=T;
}
void afis(Huge A)
{
for(int i=A[0];i>=1;i--)
printf("%d",A[i]);
}
void solve()
{
unu[0]=unu[1]=1;
for(int i=1;i<n;i++)
{
reset(d[(i+1)&1]);
adun(d[i&1][a[i]],unu);
for(int j=1;j<=MAX;j++)
if(d[i&1][j])
{
adun(d[(i+1)&1][j],d[i&1][j]);
adun(d[(i+1)&1][cmmdc(a[i+1],j)],d[i&1][j]);
}
}
adun(d[n&1][a[n]],unu);
if(d[n&1][1][0]!=0)
afis(d[n&1][1]);
else printf("0");
}
int main()
{
read();
solve();
return 0;
}