Cod sursa(job #3152931)

Utilizator Luca_CristianZamfir Luca-Cristian Luca_Cristian Data 27 septembrie 2023 09:48:41
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("gfact.in");
ofstream fout("gfact.out");

///P^Q are maxim ~ 270.000 de cifre. Putem deci, cauta binar pana la 10^7, aproximand grosolan dupa numarul de zerouri de la final
///radical din P(maxim 2 * 10^9) ~ 44.725, care inmulti cu log2(10^7) implica ~ 10^6 operatii, care intra intr-o zecime de secunda
#define int long long

bool ver(int fact, int d, int exp)
{
    int f = d, ans = 0;
    while(f <= fact)
    {
        ans += fact / f;
        f *= d;
    }

    return (ans >= exp);
}


int cautbin(int d, int exp)
{
    int st = 1, dr = 1e15, sol = 1;

    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(ver(mij, d, exp))
        {
            sol = mij;///este cea mai buna solutie pana in momentul respectiv
            dr = mij - 1;
        }
        else
            st = mij + 1;

    }

    return sol;
}


signed main()
{
    int p, q, d, sol = 0;

    fin >> p >> q;

    ///
    d = 2;
    int exp = 0;
    while(!(p % d))
    {
        exp++;
        p /= d;
    }
    exp *= q;

    if(exp)
        sol = max(sol, cautbin(d, exp));
    ///

    for(d = 3; d * d <= p; d += 2)
    {
        int exp = 0;
        while(!(p % d))
        {
            exp++;
            p /= d;
        }
        exp *= q;


        if(exp)
            sol = max(sol, cautbin(d, exp));
    }

    if(p > 1)
        sol = max(sol, cautbin(p, q));


    fout << sol;

    return 0;
}