Cod sursa(job #3299104)

Utilizator Lex._.Lexi Guiman Lex._. Data 4 iunie 2025 16:10:28
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>
#define VMAX 45000
#define NMAX 60000000000000
using namespace std;

bitset<VMAX/2> ciur; //ciurul lui eratostene
vector<int> nr_prime; //numerele prime

void eratostene() //ciurul lui eratostene
{
    for(int i=3; i*i<=VMAX; i+=2)
    {
        if(ciur[i/2]==0)
        {
            for(int j=i*i; j<=VMAX; j+=2*i)
                ciur[j/2]=1;
        }
    }
    nr_prime.push_back(2);
    for(int i=3; i<=VMAX; i+=2)
    {
        if(ciur[i/2]==0)
            nr_prime.push_back(i);
    }
}

pair<long long, int> prim_maxim(long long nr)
{
    pair<long long, int> prim_maxim={0, 0};
    for(int i=0; i<nr_prime.size(); i++)
    {
        if(nr%nr_prime[i]==0)
        {
            prim_maxim.first=nr_prime[i];
            prim_maxim.second=0;
            while(nr%nr_prime[i]==0)
            {
                prim_maxim.second++;
                nr/=nr_prime[i];
            }
        }
    }
    if(nr>1)
    {
        prim_maxim.first=nr;
        prim_maxim.second=1;
    }
    return prim_maxim;
}

long long div_fact(long long p, long long fact) //numarul de puteri a lui p din factorialul lui fact
{
    long long div_fact=0;
    long long putere=p;
    while(putere<=fact)
    {
        div_fact+=fact/putere;
        putere*=p;
    }
    return div_fact;
}

long long cautare_binara(long long p, long long q)
{
    long long st=0, dr=NMAX, b=0;
    while(st<=dr)
    {
        long long mij=st+(dr-st)/2;
        if(div_fact(p, mij)>=q)
        {
            b=mij;
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
    return b;
}

int main()
{
    ifstream cin("gfact.in");
    ofstream cout("gfact.out");
    eratostene();
    long long p, q;
    cin >> p >> q;
    long long prim=1; //cel mai mare nr prim care il divide pe p
    long long putere=1; //puterea la care apare acel nr prim

    pair<long long, int> prim_max=prim_maxim(p);

    prim=prim_max.first;
    putere=prim_max.second;

    putere*=q;
    cout << cautare_binara(prim, putere);

    return 0;
}