Cod sursa(job #3233487)

Utilizator rapidu36Victor Manz rapidu36 Data 3 iunie 2024 16:59:03
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>

using namespace std;

const int VMIN = 0;
const long long VMAX = 1LL << 50;
const int NDP = 9;

int d[NDP], p[NDP], ndp, a, q;

void descompunere()
{
    int div = 2;
    while (div * div <= a)
    {
        if (a % div == 0)
        {
            d[ndp] = div;
            p[ndp] = 0;
            while (a % div == 0)
            {
                p[ndp]++;
                a /= div;
            }
            p[ndp] *= q;
            ndp++;
        }
        div++;
    }
    if (a != 1)
    {
        d[ndp] = a;
        p[ndp++] = q;
    }
}

long long putere(int d, long long n)
{
    long long p = 0;
    while (n >= d)
    {
        p += n / d;
        n /= d;
    }
    return p;
}

bool este_div(long long n)
{
    for (int i = 0; i < ndp; i++)
    {
        if (putere(d[i], n) < p[i])///n! nu e divizibil cu d[i] la p[i]
        {
            return false;
        }
    }
    return true;
}

int main()
{
    ifstream in("gfact.in");
    ofstream out("gfact.out");
    in >> a >> q;
    descompunere();
    long long st = VMIN, dr = VMAX, rez = VMAX + 1;
    while (st <= dr)
    {
        long long m = (st + dr) / 2;
        if (este_div(m))
        {
            rez = m;
            dr = m - 1;
        }
        else
        {
            st = m + 1;
        }
    }
    out << rez << "\n";
    in.close();
    out.close();
    return 0;
}