Cod sursa(job #1375119)

Utilizator Athena99Anghel Anca Athena99 Data 5 martie 2015 12:17:27
Problema Indep Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("indep.in");
ofstream fout("indep.out");

const int nmax= 500;
const int vmax= 1000;
const int base= 10000;

int v[nmax+1];

vector <int> d[nmax+1][vmax+1];

int gcd( int x, int y ) {
    if ( y==0 )
        return x;
    return gcd( y, x%y );
}

void h_write( vector <int> &x ) {
    fout<<x.back();
    for ( int i= (int)x.size()-2; i>=0; --i ) {
        if ( x[i]<10 ) fout<<"000";
        else if ( x[i]<100 ) fout<<"00";
        else if ( x[i]<1000 ) fout<<"0";
        fout<<x[i];
    }

    fout<<"\n";
}

void hh_add( vector <int> &x, vector <int> &y ) {
    for ( int i= 0, t= 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;
    }
}

int main(  ) {
    int n;
    fin>>n;
    for ( int i= 1; i<=n; ++i ) {
        fin>>v[i];
    }

    vector <int> aux;
    aux.push_back(1);
    for ( int i= 1; i<=n; ++i ) {
        hh_add(d[i][v[i]], aux);

        for ( int j= 1; j<=vmax; ++j ) {
            int cmmdc= gcd(v[i+1], j);

            hh_add(d[i+1][j], d[i][j]);
            hh_add(d[i+1][cmmdc], d[i][j]);
        }
    }

    h_write(d[n][1]);

    return 0;
}