Cod sursa(job #2701747)

Utilizator PletoPletosu Cosmin-Andrei Pleto Data 1 februarie 2021 16:41:24
Problema GFact Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <climits>
#include <cmath>

#define NMAX 45000

using namespace std;

ifstream cin("gfact.in");
ofstream cout("gfact.out");

long long ciur[NMAX + 15], pp[NMAX], k;

int main()
{
    long long p, q;
    cin >> p >> q;
    for (long long i = 3; i * i <= NMAX; i += 2)
    {
        if (ciur[i] == 0)
        {
            for (long long j = i * i; j <= NMAX; j += i)
            {
                ciur[j] = 1;
            }
        }
    }

    pp[k++] = 2;

    for (long long i = 3; i <= NMAX; i += 2)
    {
        if (!ciur[i])
        {
            pp[k++] = i;
        }
    }

    long long p1 = p;

    //for(long long i=0;i<k;i++){cout<<pp[i]<<" ";}

    long long desc_p[NMAX] = {0}, exp_p[NMAX] = {0}, h1 = 0;

    for (long long i = 0; i < k && 1LL * pp[i] * pp[i] <= p; i++)
    {
        long long c = 0;
        while (p1 % pp[i] == 0 && p1 > 0)
        {
            c++;
            p1 /= pp[i];
        }

        if (c > 0)
        {
            desc_p[h1] = pp[i], exp_p[h1] = c;
            h1++;
        }
    }

    if (p1 > 1)
    {
        desc_p[h1] = p1, exp_p[h1] = 1;
        h1++;
    }

    //for(long long i=0;i<h1;i++){cout<<desc_p[i]<<" "<<exp_p[i]<<"   ";}

    long long st = 0, dr = LLONG_MAX, mid, mn;

    mn = dr;

    while (dr - st > 1) {
        mid = st + (dr - st) / 2;
        mid = (st + dr) / 2;
        long long mid1 = mid, s = 0, mnn = LLONG_MAX;

        bool ok = true;
        for (long long i = 0; ok and i < h1; i++) {
            while (mid1 > 0) {
                mid1 /= desc_p[i];
                s += mid1;
            }

            if (s >= exp_p[i] * q) {
                ok = false;
            }

            // if (mnn > (s / exp_p[i]))
            // {
            //     mnn = s / exp_p[i];
            // }
            //mnn=min(mnn,s/exp_p[i]);
        }
        if (ok) {
            st = mid;
        } else {
            dr = mid;
        }
    }

    cout << st + 1;

    return 0;
}