Pagini recente » Cod sursa (job #1731907) | Cod sursa (job #1794064) | Cod sursa (job #2747053) | Cod sursa (job #697425) | Cod sursa (job #181470)
Cod sursa(job #181470)
#include<cstdio>
#include<cstring>
int n,a[501],i,j,prev,now,x;
typedef int big[100];
const int baza=1000000000;
big s[2][1001],aux;
inline void add(big a,big b,big c)
{
int i;
memset(c,0,sizeof(big));
if(a[0]>b[0]) c[0]=a[0];
else c[0]=b[0];
for(i=1;i<=c[0];i++)
c[i]=a[i]+b[i];
for(i=1;i<=c[0];i++)
if(c[i]>=baza)
{
c[i+1]++;
c[i]-=baza;
}
if(c[c[0]+1]) c[0]++;
}
inline void increment(big a)
{
if(a[0]==0)
{
a[0]=1;
a[1]=1;
}
else
{
a[1]++;
int i=1;
while(a[i]>=baza)
{
a[i+1]++;
a[i]-=baza;
i++;
}
if(a[a[0]+1]) a[0]++;
}
}
inline int cmmdc(int a,int b)
{
int r;
while(a!=0)
{
r=b%a;
b=a;
a=r;
}
return b;
}
inline void print(big a)
{
int i,j;
printf("%d",a[a[0]]);
for(i=a[0]-1;i>0;--i)
{
j=baza/10;
while(a[i]/j==0 && j>1){printf("0");j/=10;}
printf("%d",a[i]);
}
printf("\n");
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
now=0;
increment(s[now][a[1]]);
for(i=2;i<=n;i++)
{
prev=now;
now=!now;
for(j=1;j<=1000;j++)
{
memcpy(s[now][j],s[prev][j],sizeof(big));
x=cmmdc(a[i],j);
add(s[now][x],s[prev][j],aux);
memcpy(s[now][x],aux,sizeof(big));
}
increment(s[now][a[i]]);
}
print(s[now][1]);
fclose(stdout);
return 0;
}