Cod sursa(job #3275001)

Utilizator rapidu36Victor Manz rapidu36 Data 8 februarie 2025 17:34:59
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>

using namespace std;

const int N = 10;
const long long VMIN = 1;
const long long VMAX = 60000000000000LL;

int dp[N], pdp[N], ndp, p, q;

void descompunere(int n)
{
    int d = 2;
    while (d * d <= n)
    {
        if (n % d == 0)
        {
            dp[ndp] = d;
            while (n % d == 0)
            {
                pdp[ndp]++;
                n /= d;
            }
            ndp++;
        }
        d++;
    }
    if (n != 1)
    {
        dp[ndp] = n;
        pdp[ndp] = 1;
        ndp++;
    }
}

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

bool se_divide(long long n)
{
    for (int i = 0; i < ndp; i++)
    {
        if (putere(n, dp[i]) < pdp[i] * q)
        {
            return false;
        }
    }
    return true;
}

long long caut_bin()
{
    long long st = VMIN, dr = VMAX, rez = dr + 1;
    while (st <= dr)
    {
        long long m = (st + dr) / 2;
        if (se_divide(m))
        {
            rez = m;
            dr = m - 1;
        }
        else
        {
            st = m + 1;
        }
    }
    return rez;
}

int main()
{
    ifstream in("gfact.in");
    ofstream out("gfact.out");
    in >> p >> q;
    descompunere(p);
    out << caut_bin() << "\n";
    in.close();
    out.close();
    return 0;
}