Cod sursa(job #1716689)

Utilizator Athena99Anghel Anca Athena99 Data 13 iunie 2016 14:50:15
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int base= 10;

int v[10];

vector <int> x[0];

void h_write( vector <int> &x ) {
    for ( int i= (int)x.size()-1; i>=0; --i ) {
        fout<<x[i];
    }
    fout<<"\n";
}

void h_reverse( vector <int> &x ) {
    vector <int> aux;
    for ( int i= (int)x.size()-1; i>=0; --i ) {
        aux.push_back(x[i]);
    }
    x= aux;
}

void hh_mult( vector <int> &x, vector <int> &y ) {
    vector <int> z;
    z.resize( (int)x.size()+(int)y.size() );
    for ( int i= 0; i<(int)x.size(); ++i ) {
        int t= 0;
        for ( int j= 0; j<(int)y.size() || t!=0; ++j ) {
            z[i+j]+= t;
            if ( j<(int)y.size() ) {
                z[i+j]= z[i+j]+x[i]*y[j];
            }
            t= z[i+j]/base;
            z[i+j]%= base;
        }
    }
    while ( z.back()==0 && (int)z.size()>=2 ) {
        z.pop_back();
    }

    x= z;
}

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

    for ( int i= 9, t= 0; i>=1; --i ) {
        for ( int j= 1; j<=v[i]; ++j, t^= 1 ) {
            x[t].push_back(i);
        }

        if ( x[0].size()>x[1].size() ) {
            for ( ; i-1>=1 && v[i-1]==0; --i ) ;
            if ( i-1>=1 ) {
                x[1].push_back(i-1);
                --v[i-1];
            }
        }
    }

    h_reverse(x[0]), h_reverse(x[1]);
    hh_mult(x[0], x[1]);
    h_write(x[0]);

    return 0;
}