Cod sursa(job #2832697)

Utilizator AswVwsACamburu Luca AswVwsA Data 14 ianuarie 2022 10:05:33
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <climits>
#include <vector>
using namespace std;

ifstream cin("gfact.in");
ofstream cout("gfact.out");
long long fact(long long x, int div)
{
    long long ans = 0;
    for (; x >= div; x /= div)
        ans += x / div;
    return ans;
}

vector <pair <int, int> > help;
vector <long long> prime;
const int VALMAX = 44721;
bool v[VALMAX + 3];
void ciur()
{
    prime.push_back(2);
    for (int i = 3; i * i <= VALMAX; i += 2)
        for (int j = i * i; j <= VALMAX; j += (i << 1))
            v[j] = 1;
    for (int i = 3; i <= VALMAX; i += 2)
        if (!v[i])
            prime.push_back(i);
}
int main()
{
    int p, q;
    cin >> p >> q;
    ciur();
    //desc
    for (int i = 0; i < prime.size() and prime[i] * prime[i] <= p;
            i++
        )
    {
        if (p % prime[i])
            continue;
        int aux = 0;
        while (p % prime[i] == 0)
        {
            aux++;
            p /= prime[i];
        }
        help.push_back({prime[i], aux * q});
    }
    if (p > 1)
        help.push_back({p, q});
    /*for (int i = 0; i < help.size(); i++)
        cout << fact(10009676333, help[i].first) << " ";
    return 0;*/
    long long st = 1, dr = LLONG_MAX - 1, sol = -1;
    while (st <= dr)
    {
        long long med = ((st + dr) >> 1);
        bool ok = 0;
        for (int i = 0; i < help.size(); i++)
        {
            long long val = fact(med, help[i].first);
            if (val < help[i].second)
            {
                ok = 1;
                break;
            }
        }
        if (!ok)
        {
            sol = med;
            dr = med - 1;
        }
        else st = med + 1;
    }
    cout << sol;
}