Cod sursa(job #500290)

Utilizator Teodor94Teodor Plop Teodor94 Data 11 noiembrie 2010 20:44:09
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#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;
}