Cod sursa(job #2222150)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 16 iulie 2018 15:58:17
Problema Factorial Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>

using namespace std;
int v[12]= {0,4,28,152,776,3900,19524,97648,488272,2441396,12207020,61035144};
int p5[12]= {0,25,125,625,3125,15625,78125,390625,1953125,9765625,48828125,244140625};
ifstream cin("fact.in");
ofstream cout("fact.out");
int main() {
    long long p,i,st,dr,rez;
    cin>>p;
    i=1;
    while(p>v[i])
        i++;
    if(p==0)
        cout<<"1";
    else if(i<=12) {
        st=p5[i-1];
        dr=p5[i]-1;
        int med,last=-1,p51,sum;
        int j;
        while(st<=dr) {
            med=st+(dr-st)/2; ///st+(dr-st)/2
            sum=0;
            p51=5;
            for(j=1; j<=i; j++) {
                sum+=med/p51;
                p51*=5;
            }
            if(sum>=p) {
                dr=med-1;
                if(sum==p)
                    last=med;
            } else {
                st=med+1;
            }
        }
        cout<<last;
    } else {
        st=p5[i-1];
        dr=4611686018427388000;
        long long med,last=-1,p51,sum;
        long long j;
        while(st<=dr) {
            med=st+(dr-st)/2; ///st+(dr-st)/2
            sum=0;
            p51=5;
            for(j=1; j<=i; j++) {
                sum+=med/p51;
                p51*=5;
            }
            if(sum>=p) {
                dr=med-1;
                if(sum==p)
                    last=med;
            } else {
                st=med+1;
            }
        }
        cout<<last;
    }
    return 0;
}