Cod sursa(job #607067)

Utilizator crushackPopescu Silviu crushack Data 10 august 2011 18:10:24
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#define NMax 510
#define MMax 1010
#define LMax 31

const char IN[]="indep.in",OUT[]="indep.out";
const long long base=1000000000000000000LL;

int N;
long long T[MMax][LMax] ;
int a[NMax];

inline void add(long long *a,long long *b)
{
    int t=0,i;
    a[0]= b[0]>a[0] ? b[0] : a[0];
    for (i=1;i<=a[0];++i)
    {
        a[i]+=b[i]+t;t=0;
        while (a[i]>=base) a[i]-=base,++t;
    }
    if (t) a[++a[0]]=t;
}

inline void inc(long long *a)
{
    int t=1,i;
    a[0]+=!a[0];
    for (i=1;i<=a[0];++i)
    {
        a[i]+=t;t=0;
        while (a[i]>=base) a[i]-=base,++t;
    }
    if (t) a[++a[0]]=t;
}

inline int gcd(int a,int b)
{
    static int r;
    while (b)
        b= (r=a%b,a=b,r);
    return a;
}

void solve()
{
    int i,j;
    for (i=0;i<N;++i)
    {
        for (j=1;j<MMax;++j)
            //T[gcd(j,a[i])]+=T[j];
            add(T[gcd(j,a[i])],T[j]);
        inc(T[a[i]]);
    }
}

inline void write(long long *a)
{
    int i;long long b;

    for (i=a[0];i>0;--i)
    {
        if (i!=a[0])
        for (b=base/10;b>1 && a[i]<b;b/=10) printf("0");
        printf("%lld",a[i]);
    }
}

int main()
{
    int i;
    freopen(IN,"r",stdin);
    scanf("%d",&N);
    for (i=0;i<N;++i) scanf("%d",a+i);
    fclose(stdin);

    solve();

    freopen(OUT,"w",stdout);
    write(T[1]);printf("\n");
    fclose(stdout);
    return 0;
}