Cod sursa(job #859237)

Utilizator stoicatheoFlirk Navok stoicatheo Data 19 ianuarie 2013 21:59:13
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
 
using namespace std;
 
ifstream f("gfact.in");
ofstream g("gfact.out");
 
const long long LIM = 1LL * 30000 * 30 * 2000000000;
 
long long P, sol, fact;
int Q, need;
 
long long baga(long long val, long long fact)
{
    long long aux = fact, ret = 0;
     
    while (aux <= val) {
        ret += val / aux;
        aux *= fact;
    }
     
    return ret;
}
 
long long bsearch(long long lo, long long hi, long long fact)
{
    long long mid;
     
    while (lo <= hi) {
        mid = lo + (hi - lo) / 2;
        if (baga(mid, fact) < need)
            lo = mid + 1;
        else
            hi = mid - 1;
    }
     
    if (baga(mid, fact) < need)
        mid++;
    return mid;
}
 
void solve(long long fact, int put)
{
    need = put * Q;
     
    long long rez = bsearch(1, LIM, fact);
    if (rez > sol)
        sol = rez;
}
 
int main()
{
    f >> P >> Q;
    long long aux = P;
     
    for (long long fact = 2; fact * fact <= P && aux > 1; fact++) {
        int put = 0;
        while (aux % fact == 0) {
            aux /= fact;
            put++;
        }
        if (put)
            solve(fact, put);
    }
    if (aux > 1)
        solve(aux, 1);
     
    g << sol << '\n';
     
    return 0;
}