Cod sursa(job #1594416)

Utilizator mateiivanMatei Ivan mateiivan Data 9 februarie 2016 14:46:29
Problema Factorial Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
using namespace std;
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <algorithm>

long long func(int mijloc);
void minim(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 = 400000015;

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

        if(func(mijloc) > p){
            dreapta = mijloc;
        }
        else if(func(mijloc) < p)
            stanga = mijloc;
        else
            break;
    }

    //cout<<mijloc<<endl;
    minim(mijloc,p);

    return 0;
}

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

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

    return nr;
}

void minim(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;

}