Cod sursa(job #1464098)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 22 iulie 2015 12:23:48
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>

using namespace std;

long long powerInFact(long long number, long long div)
{
    long long i = div;
    long long result = 0;
    while(i <= number)
    {
        result += number / i;
        i *= div;
    }
    return result;
}

long long minFact(long long nr, long long power)
{
    long long left = 1 , right = power, mid;
    long long pow;
    while(left < right)
    {
        mid = (left + right) / 2;
        pow = powerInFact(mid * nr, nr);
        if(pow < power)
            left = mid + 1;
        else
            right = mid;
    }
    return right * nr;
}

long long maxFact(long long p, long long q)
{
    long long power;
    long long maxNr = 0;
    long pp = p;
    for(int i = 2; p > 1 && i * i <= pp ; i++)
    {
        if(p % i == 0)
        {
            power = 0;
            while(p % i == 0)
            {
                power++;
                p /= i;
            }
            maxNr = max(maxNr, minFact(i, power * q));
        }
    }
    if(p > 1)
        maxNr = minFact(p, q);
    return  maxNr;
}

int main()
{
    int p, q;
    ifstream f("gfact.in");
    f >> p >> q;
    f.close();
    ofstream g("gfact.out");
    g << maxFact(p, q) << '\n';
    g.close();
    return 0;
}