Cod sursa(job #478112)

Utilizator SpiderManSimoiu Robert SpiderMan Data 17 august 2010 14:18:13
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
# include <cstdio>

typedef int Mare[45] ;
const char FIN[] = "indep.in", FOU[] = "indep.out" ;
const int base = 1000000000 ;

Mare S[2][1005] ;
int V[505] ;
int N, max ;

inline int maxim ( int A, int B ) {
    if ( A > B ) {
        return A ;
    } else {
        return B ;
    }
}

inline int cmmdc ( int A, int B ) {
    while ( B ) {
        int R = A % B ;
        A = B ;
        B = R ;
    }

    return A ;
}

void add ( Mare A, Mare B ) {
    int i, t = 0;

    for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= base) {
        A[i] = ( t += ( i <= A[0] ? A[i] : A[i] = 0 ) + ( i <= B[0] ? B[i] : B[i] = 0 ) ) % base;
    }

    A[0] = i - 1;
}

void afis ( Mare A ) {
    printf ( "%d" , A[A[0]] ) ;
    for ( int i = A[0] - 1; i ; --i ) {
        printf ( "%09d", A[i] ) ;
    }
}

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    scanf ( "%d", &N ) ;

    for ( int i = 1; i <= N; ++i ) {
        scanf ( "%d", V + i ) ;
        max = maxim ( max, V[i] ) ;
    }

    for ( int i = 1, k = 0; i <= N; ++i, k = !k ) {
        S[!k][ V[i] ][0] = S[!k][ V[i] ][1] = 1 ;
        for ( int j = 1, l ; j <= max; ++j ) {
            if ( S[k][j][0] ) {
                l = cmmdc ( j, V[i] ) ;
                add ( S[!k][l], S[k][j] ) , add ( S[!k][j], S[k][j] ) ;
            }
        }
        for ( int j = 1; j <= max; ++j ) {
            S[k][j][0] = 0;
        }
    }


    afis ( S[N & 1][1] ) ;

    return 0;
}