Cod sursa(job #1149377)

Utilizator PatrikStepan Patrik Patrik Data 21 martie 2014 19:24:14
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define NMAX 501
    #define VMAX 1001
    #define BASE 1000000000
    int N , v[NMAX] , g[VMAX][VMAX];
    struct huge{
        int nr[300];
        huge()
        {
            memset(nr,0,sizeof(nr));
        }
    }D[2][VMAX] , unu;

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

    void cpy(huge &A , huge B)
    {
        for(int i = 1 ; i <= B.nr[0] ; ++i )
            A.nr[i] = B.nr[i];
        A.nr[0] = B.nr[0];
    }

    int sz(huge A)
    {
        return A.nr[0];
    }

    void seteaza(huge &A , int val)
    {
        A.nr[1] = val;
        A.nr[0] = 1;
    }

    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[sz(A)]);
        for(int i = sz(A)-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]);
        for(int i = 1 ; i < VMAX ; ++i )
            for(int j = 1 ; j < VMAX ; ++j )
            g[i][j]  = g[j][i] = gcd(i,j);

        seteaza (D[0][v[1]] , 1);
        unu.nr[1] = unu.nr[0] = 1;
        for(int i = 2 , j = 1; i <= N ; ++i , j = 1-j )
        {
            for(int k = 1 ; k < VMAX ; ++k )
                    cpy(D[j][k],D[1-j][k]);
            for(int k = 1 ; k < VMAX ; ++k )
               add( D[j][g[k][v[i]]] , D[1-j][k]);
            add(D[j][v[i]],unu);

        }
        if(N%2)tipar(D[0][1]);
        else tipar(D[1][1]);
        return 0;
    }