Cod sursa(job #505381)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 1 decembrie 2010 22:42:12
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<cstdio>
typedef int mare[1<<10];
int MAX,n,x[1<<9];
mare one,d[2][1<<10];
void citeste()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x[i]);
        if(x[i]>MAX)
            MAX=x[i];
    }
}
int cmmdc(int x,int y)
{
    int r=x%y;
    while(r)
    {
        x=y;
        y=r;
        r=x%y;
    }
    return y;
}
void reset(mare v[1<<10])
{
    for(int i=1;i<=MAX;i++)
        v[i][0]=0;
}
void adunare(mare A,mare 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(mare A)
{
    for(int i=A[0];i>=1;i--)
        printf("%d",A[i]);
}
void rezolva()
{
    one[0]=one[1]=1;
    for(int i=1;i<n;i++)
    {
        reset(d[(i+1)&1]);
        adunare(d[i&1][x[i]],one);
        for(int j=1;j<=MAX;j++)
            if(d[i&1][j])
            {
                adunare(d[(i+1)&1][j],d[i&1][j]);
                adunare(d[(i+1)&1][cmmdc(x[i+1],j)],d[i&1][j]);
            }
    }
    adunare(d[n&1][x[n]],one);
    if(d[n&1][1][0]!=0)
        afis(d[n&1][1]);
        else printf("0");
}
int main()
{
    citeste();
    rezolva();
    return 0;
}