Cod sursa(job #846363)

Utilizator informatician28Andrei Dinu informatician28 Data 1 ianuarie 2013 22:26:19
Problema GFact Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <cmath>

using namespace std;

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

int P, Q, contor;
long long Sol;
struct factor
{
    int fact, power; // fact = baza, power = exponent
}f[25];

void Desc (int nr)
{
    int exp = 0;
    for (int i = 2; i*i <= nr; i++)
    {
        if (nr % i == 0)
        {
            exp = 0;
            while (nr % i == 0) nr /= i, ++exp;
            f[++contor].fact = i, f[contor].power = exp*Q;
        }
    }
    if (nr > 1) f[++contor].fact = nr, f[contor].power = 1*Q;
}

long long put (long long B, long long T)
{
    long long put2 = 1, answer = 0;
    put2 *= T;
    while (B >= put2)
    {
        answer += B/put2;
        put2 *= T;
    }
    return answer;
}

int check (long long b)
{
    for (int i = 1; i <= contor; i++)
    {
        if (put(b, f[i].fact) < f[i].power) return 0;
    }
    return 1;
}

long long bs()
{
    unsigned long long left, right, mid, last;
    left = 1;
    right = (unsigned long long)20000000*30000;
    while (left <= right)
    {
        mid = left + (right-left)/2;
        if (check(mid) == 0) left = mid + 1;
        else {
        right = mid - 1;
        last = mid;} // minimul per total
    }
    return last;
}

int main()
{
    in >> P >> Q;
    Desc(P);
    Sol = bs();
    out << Sol;
    return 0;
}