Cod sursa(job #1594539)

Utilizator mateiivanMatei Ivan mateiivan Data 9 februarie 2016 15:58:02
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
using namespace std;
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <algorithm>

long long func1(int mijloc);
void minim1(int mijloc, int p);


int main(){

    long long p;
    long long stanga, dreapta, mijloc;

    freopen("fact.in","r",stdin);
    freopen("fact.out","w",stdout);
    cin >> p;

    if(p == 0){
        cout<<1;
        return 0;
    }

    stanga = 0;
    dreapta = 400000016;

    while(dreapta - stanga > 1){
        mijloc = (dreapta + stanga)/2;

        if(func1(mijloc) > p){
            dreapta = mijloc;
        }
        else if(func1(mijloc) < p)
            stanga = mijloc;
        else{
            break;
        }
    }
    //cout<<"stanga"<<stanga<<endl;
    //cout<<"dreapta"<<dreapta<<endl;
    //cout<<"mijloc"<<mijloc<<endl;
    if(dreapta == stanga+1)
        cout<<-1;
    else
        minim1(mijloc,p);

    return 0;
}

long long func1(int mijloc){
     long long nr = 0,putere = 5;

     while(mijloc >= putere ){
        nr += mijloc/putere;
        putere *= 5;
     }

    return nr;
}

void minim1(int mijloc, int p){

    long long nr,putere;

    while(true){
        nr = 0;
        putere = 5;
         while(mijloc >= putere ){
            nr += mijloc/putere;
            putere *= 5;
        }
        if(nr == p)
            mijloc--;
        else
            break;
    }

    cout<<mijloc+1;

}