Cod sursa(job #464192)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 19 iunie 2010 10:31:05
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <cstring>

#define file_in "indep.in"
#define file_out "indep.out"

#define Baza 1000000000

int n,v[530],cnt[2][1<<10][1<<4],q[1<<4];

void citire()
{
    freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);

    scanf("%d", &n);
    for (int i=1;i<=n;++i)
         scanf("%d", &v[i]);
}

int cmmdc(int a, int b)
{
    int r;

    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

void add(int a[], int b[])
{
    int i,t=0;
    for (i=1;i<=a[0] || i<=b[0] ||t;++i,t/=Baza)
         a[i]=(t+=a[i]+b[i])%Baza;
    a[0]=i-1;
}

void scrie(int a[])
{
    int i;
    printf("%d\n", a[a[0]]);
    for (i=a[0]-1;i>=1;--i)
         printf("%09d", a[i]);
}

void solve()
{
    int i,j;
    q[0]=q[1]=1;
    memset(cnt,0,sizeof(cnt));
    int ind=0;
    for (i=n;i>=1;--i,ind^=1)
     {
         memcpy(cnt[ind^1],cnt[ind],sizeof(cnt[ind]));
         for (j=1;j<=1000;++j)
              add(cnt[ind^1][cmmdc(j,v[i])],cnt[ind][j]);
         add(cnt[ind^1][v[i]],q);
         //ind^=1;
     }
     //printf("%d", cnt[ind][1]);
     scrie(cnt[ind][1]);
}

int main()
{
    citire();
    solve();

    fclose(stdin);
    fclose(stdout);

    return 0;

}