Cod sursa(job #784873)

Utilizator TheNechizFMI Razvan Birisan TheNechiz Data 7 septembrie 2012 10:57:52
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
# include <fstream>

using namespace std;

int c[] =
{
  1 , 5 , 25 , 125 , 625 , 3125 , 15625 , 78125 ,
  390625 , 1953125 , 9765625 , 48828125 , 244140625
};

int c1[] =
{
  0 , 1 , 6 , 31 , 156 , 781 , 3906 , 19531 ,
  97656 , 488281 , 2441406 , 12207031 , 61035156
};

int caut_b( int tinta ){

    short li,ls,mij,poz = 0;

    li = 0 ;
    ls = 12 ;

    while( li <= ls )
    {
        mij = ( li +ls ) / 2;

        if( c1[mij] <= tinta && poz < mij ) poz = mij;
        if( c1[mij] <= tinta )
            li = mij + 1;
            else
                ls = mij - 1;
    }

    return poz;
}

int main(){

    ifstream in("fact.in");
    ofstream out("fact.out");

    int p,p1,nr = 0,temp,nr1 = 0;

    in >> p;

    if( !p )
    {
        out << 1;
        in.close();
        out.close();
        return 0;
    }

    p1 = p;

    while(p1)
    {
        temp = caut_b(p1);
        nr += c[temp];
        p1 -= c1[temp];
    }

    p1 = 0;
    for( short i = 2 ; i <= 12 ; ++i )
        if( nr % c[i] == 0 )
            ++p1;

    if( p1 == 0 )
        out << nr;
        else
            {
                ++p;

                while(p)
                {
                    temp = caut_b(p);
                    nr1 += c[temp];
                    p -= c1[temp];
                }

                if( nr == nr1 )
                    out << -1;
                    else
                        out << nr;
            }

    in.close();
    out.close();

    return 0;
}