Cod sursa(job #1149405)

Utilizator PatrikStepan Patrik Patrik Data 21 martie 2014 20:13:57
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define NMAX 501
    #define BASE 1000000000
    #define VMAX 1001
    int N , v[NMAX] ;
    struct huge{
        int nr[200];
    }D[VMAX] , unu;

    inline void add(huge &A , huge B)
    {
        int t = 0 , p = 1;
        for( p = 1 ; p <= A.nr[0] || p <= B.nr[0] || t ; ++p , t/=BASE)
        {
            t += A.nr[p] + B.nr[p];
            A.nr[p] = t%BASE;
        }
        A.nr[0] = p-1;
    }

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

    void tipar(huge A)
    {
        printf("%d" , A.nr[A.nr[0]]);
        for(int i = A.nr[0]-1 ; i ; i-- )
            printf("%09d" , A.nr[i]);
    }

    int main()
    {
        freopen("indep.in" , "r" , stdin );
        freopen("indep.out" , "w" , stdout );
        scanf("%d" , &N );
        for(int i = 1 ; i <= N ; ++i )
            scanf("%d" , &v[i]);
        unu.nr[1] = unu.nr[0] = 1;
        for(int i = 1 ; i <= N ; ++i)
        {
            for(int k = 1 ; k < VMAX ; ++k )
               add( D[gcd(k,v[i])] , D[k]);
            add(D[v[i]],unu);
        }
        tipar(D[1]);
        return 0;
    }