Cod sursa(job #1239510)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 9 octombrie 2014 09:40:27
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<cstdio>
#include<vector>

using namespace std;

FILE *fin = fopen( "indep.in" , "r" ), *fout = fopen( "indep.out" , "w" );

const int mxmx = 1000;
const int base = 100000000;
const int nmax = 500;
short int v[ nmax + 1 ];
vector <int> d[ 2 ][ mxmx + 1];

int gcd( int a, int b ) {
    if ( b == 0 ) {
        return a;
    } else {
        return gcd( b, a % b );
    }
}
void hh_add( vector <int> &x, vector <int> y ) {
    int t = 0;
    for( int i = 0; i < (int)x.size() || i < (int)y.size() || t != 0; ++ i ) {
        if ( i == (int)x.size() ) {
            x.push_back( 0 );
        }
        if ( i < (int)y.size() ) {
            x[ i ] += y[ i ];
        }
        x[ i ] += t;
        t = x[ i ] / base;
        x[ i ] %= base;
    }
}
void af_ok( int x ) {
    if ( x > base / 10 ) {
        fprintf( fout, "%d", x );
    }
    fprintf( fout, "0" );
    af_ok( x * 10 );
}
int main() {
    int n, mx, ind, r;

    fscanf( fin, "%d", &n );
    mx = 0;
    for( int i = 1; i <= n; ++ i ) {
        fscanf( fin, "%hd", &v[ i ] );
        mx = mx < v[ i ] ? v[ i ] : mx;
    }

    ind = 1;
    d[ 0 ][ 0 ].push_back( 1 );
    for( int i = 1; i <= n; ++ i, ind = 1 - ind ) {
        for( int j = 0; j <= mx; ++ j ) {
            d[ ind ][ j ] = d[ 1 - ind ][ j ];
        }
        for( int j = 0; j <= mx; ++ j ) {
            r = gcd( (int)v[ i ], j );
            hh_add( d[ ind ][ r ], d[ 1 - ind ][ j ] );
        }
    }

    ind = 1 - ind;
    if ( d[ ind ][ 1 ].size() == 0 ) {
        fprintf( fout, "0\n" ); return 0;
    }
    fprintf( fout, "%d", d[ ind ][ 1 ][ (int)d[ ind ][ 1 ].size() - 1 ] );

    for( int i = (int)d[ ind ][ 1 ].size() - 2; i >= 0; -- i ) {
        af_ok( d[ ind ][ 1 ][ i ] );
        fprintf( fout, "%d", d[ ind ][ 1 ][ i ] );
    }
    fprintf( fout, "\n" );

    fclose( fin );
    fclose( fout );
    return 0;
}