Cod sursa(job #1602178)

Utilizator Athena99Anghel Anca Athena99 Data 16 februarie 2016 17:10:12
Problema Numere 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.95 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

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

const int base= 10;

int b;
vector <int> p, a;

int hh_comp ( vector <int> &x, vector <int> &y ) {
    if ( (int)x.size()<(int)y.size() ) {
        return 0;
    } else if ( (int)y.size()<(int)x.size() ) {
        return 1;
    }
    for ( int i= (int)x.size()-1; i>=0; --i ) {
        if ( x[i]<y[i] ) {
            return 0;
        } else if ( y[i]<x[i] ) {
            return 1;
        }
    }

    return 2;
}

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

    fout<<"\n";
}

void h_read ( vector <int> &x )
{
    string s;
    fin>>s;
    for ( int i= (int)s.size()-1; i>=0; --i ) {
        x.push_back(s[i]-'0');
    }
}

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;
    }
}

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;
}

void hn_div (vector <int> &x, int y )
{
    for ( int i= (int)x.size()-1; i>=1; --i ) {
        x[i-1]+= x[i]%y*base;
        x[i]/= y;
    }
    x[0]/= y;

    while ( x.size()>=2 && x.back()==0 ) {
        x.pop_back();
    }
}

void lgput( vector <int> &x, int y ) {
    vector <int> z, aux;
    z.push_back(1);
    for ( ; y>0; y/= 2 ) {
        if ( y%2==1 ) {
            hh_mult(z, x);
        }
        aux= x;
        hh_mult(x, aux);
    }
    x= z;
}

int main(  ) {
    h_read(p);

    if ( (int)p.size()==1 && p[0]==1 ) {
        a.push_back(1);
        b= 0;
    } else {
        bool ok= 0;
        for ( int i= 2; i<=9 && ok==0; ++i ) {
            vector <int> aux, aux2;
            aux.push_back(i);
            aux2= aux;

            int power= 1;
            while ( hh_comp(aux, p)==0 ) {
                hh_mult(aux, aux2);
                ++power;
            }
            if ( hh_comp(aux, p)==2 ) {
                a.push_back(i);
                b= power;
                ok= 1;
            }
        }

        vector <int> p2, two;
        p2.push_back(8);
        two.push_back(2);
        for ( int i= 100; i>=2 && ok==0; --i ) {
            vector <int> aux, aux2;
            aux.push_back(0);

            while ( 1 ) {
                vector <int> k= p2;
                lgput(k, i);
                if ( hh_comp(k, p)!=0 ) {
                    break;
                }
                hh_mult(p2, two);
            }

            for ( vector <int> step= p2; (int)step.size()!=1 || step[0]!=0; hn_div(step, 2) ) {
                aux2= aux;
                hh_add(aux2, step);

                if ( hh_comp(aux2, p)!=1 ) {
                    lgput(aux2, i);

                    int cmp= hh_comp(aux2, p);
                    if ( cmp==0 || cmp==2 ) {
                        hh_add(aux, step);
                        if ( cmp==2 ) {
                            a= aux, b= i;
                            ok= 1;
                        }
                    }
                }
            }
        }

        if ( (int)a.size()==0 ) {
            a= p;
            b= 1;
        }
    }

    h_write(a);
    fout<<b<<"\n";

    return 0;
}