Cod sursa(job #757140)

Utilizator anca1243Popescu Anca anca1243 Data 11 iunie 2012 10:00:50
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
const int C=101;
const int M=1000000000;
int n,v[505],d[2][1005][C];
int cmmdc(int a,int b)
{
    int r;
    while(b != 0)
    {
        r = a%b;
        a = b;
        b = r;
    }
    return a;
}
void adunare(int a[C],int b[C])
{
    int i,aux,t=0;
    for(i=1 ; i<=a[0] || i<=b[0] || t!=0 ; i++)
    {
        aux = a[i] + b[i] + t;
        a[i] = aux%M;
        t = aux/M;
    }
    a[0]=i-1;
}

void reset(int a)
{
    for(int j=0;j<=1000;j++)
        for(int i=0;i<C;i++)
            d[a][j][i] = 0;
}


void afisare(int v[C])
{
    //if(v[0] == 0) out << 0;
    printf("%d",v[v[0]]);
    for(int i=v[0]-1 ; i>=1 ; i--)
        printf("%09d",v[i]);
    //out << "\n";
}

void rez()
{
    int c,i1,i2;
    d[0][0][0] = d[0][0][1] = 1;
    for(int i=1;i<=n;i++)
    {
        i1 = i%2;
        i2 = 1 - i1;
        reset(i1);
        for(int j=0;j<=1000;j++)
        {
            c = cmmdc(j,v[i]);
            adunare(d[i1][c],d[i2][j]);
        }
        for(int j=0 ; j<=1000 ; j++)
            adunare(d[i1][j],d[i2][j]);
       // for(int j=0;j<=n;j++){
         //   afisare(d[i1][j]);
          //  out<<"\t";
        //}
        //out<<"\n";
    }
}

int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    scanf("%d",&n);
    int i,j;
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    rez();
    afisare(d[n%2][1]);
    return 0;
}