Cod sursa(job #3332405)

Utilizator razvanalexrotaruRazvan Alexandru Rotaru razvanalexrotaru Data 6 ianuarie 2026 16:08:46
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
using namespace std;

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

long long int k, p, q, st, dr, mij, ras, cnt;

struct exponent
{
    long long int fact, ex;
} v[101];

bool rasp(long long int x) {
    for(long long int i = 1; i <= k; i++)
    {
        long long int a = v[i].fact;
        long long int s = 0;

        // Calculam puterea factorului prim in x!
        while(x >= a)
        {
            s += x / a;
            // Verificare overflow: daca a * fact ar depasi x, ne oprim.
            // Conditia x/fact < a este echivalenta cu x < a * fact
            if(x / v[i].fact < a) break;
            a = a * v[i].fact;
        }

        // Verificam daca puterea din x! este suficienta
        // Atentie: v[i].ex * q trebuie comparat cu s.
        if(s < v[i].ex * q) return 0;
    }
    return 1;
}

long long int cautare_binara() {
    st = 1;
    // CORECTIE 1: Folosim sufixul LL pentru a garanta ca e Long Long, nu double.
    // 2e18 acopera lejer orice solutie posibila.
    dr = 2000000000000000000LL;
    ras = dr; // Initializam raspunsul cu maximul posibil

    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(rasp(mij))
        {
            ras = mij;
            dr = mij - 1;
        }
        else
        {
            st = mij + 1;
        }
    }
    return ras;
}

int main() {
    cin >> p >> q;

    // CORECTIE 2: Ai aplicat bine long long aici, il pastram.
    for(long long int i = 2; i * i <= p; i++)
    {
        if(p % i == 0)
        {
            k++;
            v[k].fact = i;
            cnt = 0;
            while(p % i == 0)
            {
                p /= i;
                cnt++;
            }
            v[k].ex = cnt;
        }
    }
    if(p != 1)
    {
        k++;
        v[k].fact = p;
        v[k].ex = 1;
    }

    cout << cautare_binara();
    return 0;
}