Cod sursa(job #3215969)

Utilizator rapidu36Victor Manz rapidu36 Data 15 martie 2024 15:09:41
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <vector>

using namespace std;

const long long VMAX = 1e14;

void descompun(vector < pair <int, int>> &v, int n)
{
    int d = 2;
    while (d * d <= n)
    {
        if (n % d == 0)
        {
            int p = 0;
            while (n % d == 0)
            {
                p++;
                n /= d;
            }
            v.push_back({d, p});
        }
        d++;
    }
    if (n != 1)
    {
        v.push_back({n, 1});
    }
}

long long putere_fact(long long n, int dp)
{
    ///returneaza puterea la care apare dp (prim) in desc. lui n!
    long long p = 0;
    while (n >= dp)
    {
        p += (n /= dp);
    }
    return p;
}

bool este_div(long long n, vector < pair <int, int>> &dp, int q)
{
    ///verifica daca n! este divizibil cu produsul asoc. lui dp la puterea q
    for (auto div_prim: dp)
    {
        if (putere_fact(n, div_prim.first) < q * div_prim.second)
        {
            return false;
        }
    }
    return true;
}

long long caut_bin(int p, int q)
{
    vector < pair <int, int>> d;
    descompun(d, p);
    long long st = 0, dr = VMAX, rez = dr + 1;
    while (st <= dr)
    {
        long long m = (st + dr) / 2;
        if (este_div(m, d, q))
        {
            rez = m;
            dr = m - 1;
        }
        else
        {
            st = m + 1;
        }
    }
    return rez;
}

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