Cod sursa(job #1700193)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 9 mai 2016 19:42:50
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

long long countDiv(long long n, int d)
{
    long long sum = 0;
    long long k = d;

    while (n >= k)
    {
        sum += n / k;
        k *= static_cast<long long>(d);
    }

    return sum;
}

long long bin_search(int factor, long long goodCount)
{
    long long l = 0, r = numeric_limits<long long>::max() / 2;
    long long found = -1;

    while (l <= r)
    {
        long long m = (l + r) / 2;

        if (countDiv(m, factor) >= goodCount)
        {
            found = m;
            r = m - 1;
        }
        else
            l = m + 1;
    }

    assert(found != -1);
    return found;
}

int main()
{
    ifstream in("gfact.in");
    ofstream out("gfact.out");

    int P, Q;
    in >> P >> Q;

    long long factorial = 1;

    for (int d = 2; d * d <= P; ++d)
    {
        if (P % d == 0)
        {
            int e = 0;

            while (P % d == 0)
            {
                P /= d;
                e++;
            }

            long long tmp = bin_search(d, static_cast<long long>(e) * Q);
            factorial = max(factorial, tmp);
        }
    }

    if (P > 1)
    {
        long long tmp = bin_search(P, static_cast<long long>(Q));
        factorial = max(factorial, tmp);
    }

    out << factorial << endl;

    in.close();
    out.close();

    return 0;
}