Cod sursa(job #1636535)

Utilizator cristina_borzaCristina Borza cristina_borza Data 7 martie 2016 10:39:03
Problema GFact Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>

#define INF 5000000000
#define NMAX 50

using namespace std;

ifstream f("gfact.in");
ofstream g("gfact.out");

long long p , q , n , sol , nr;

void desc(long long x);

long long verif(long long x , long long exp , long long div);
long long caut_bin(long long exp , long long div);

int main() {
    f >> p >> q;

    desc(p);
    return 0;
}


void desc(long long x) {
    long long d = 2;
    while(x != 1 && d < x) {
        if(x % d == 0) {
            while(x % d == 0) {
                ++nr;
                x /= d;
            }

            nr *= q;
            sol = max(sol , caut_bin(nr , d));
        }

        ++d;
    }

    if(x != 1) {
        nr = q;
        sol = max(sol , caut_bin(nr , d));
    }

    g << sol;
}

long long caut_bin(long long exp , long long div) {
    long long i , p = 0;
    for(i = 1 ; i <= INF ; i <<= 1);
    while(i) {
        if(verif(i + p , exp , div) == 0) {
            p += i;
        }

        i >>= 1;
    }

    return p + 1;
}


long long verif(long long x , long long exp , long long div) {
    long long p = div , aux = 0;
    while(p <= x) {
        aux += x / p;
        p *= div;
    }

    if(aux < exp) {
        return 0;
    }

    return 1;
}