Cod sursa(job #2795141)

Utilizator db_123Balaban David db_123 Data 6 noiembrie 2021 00:14:47
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb

#include <fstream>
#include <bitset>
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");

#define ull unsigned long long
#define ui unsigned int

const int MaxPrimeNumber=44723;//48611;//5000th prime number

bitset <MaxPrimeNumber> ciur;

ui p,q,primeNumbers[4653]= {1,2},base[25],exp[25],cnt,cp;

bool isValid(ull  b)
{
    for (ui i=1;i<=cnt;++i)
    {
        ull cnt=0,minLimit=exp[i]*q;
        for (ull j=base[i];j<=b && cnt<minLimit;j*=base[i])
        {
            cnt+=b/j;;
        }

        if (cnt < minLimit)
        {
            return 0;
        }

    }
    return 1;
}
ull binarySearch(ull left, ull right)
{
    ull  sol;
    while (left<=right){
        ull mid=(left+right)/2;
        if (isValid(mid))
        {
            sol=mid;
            right=mid-1;
        }
        else
            left=mid+1;
    }
    return sol;
}
int main()
{
    ///build ciur
    /// nr pare
    for (ull j=4; j<=MaxPrimeNumber; j+=2)
    {
        ciur[j]=1;
    }
    for (int i=3; i<=MaxPrimeNumber; i+=2)
    {
        if (!ciur[i]) /// is prime ?
        {
            /// primeNumbers[0] how many prime numbers
            primeNumbers[++primeNumbers[0]]=i;
            for (ull j=i; j<=MaxPrimeNumber; j+=i)
            {
                ciur[j]=1;
            }
        }
    }
    cin>>p>>q;
    cp=p;
    /// descompunem numarul p in factori primi
    for (ui i=1;i<=primeNumbers[0] && primeNumbers[i]*primeNumbers[i]<=p;++i)
    {
        if (p%primeNumbers[i])
            continue;

        base[++cnt]=primeNumbers[i]; /// baza

        while(p%primeNumbers[i]==0){
          exp[cnt]++;               /// exponent
          p/=primeNumbers[i];
        }
    }
    if (p>1){ /// prime number
        base[++cnt]=p;
        exp[cnt]=1;
    }
    cout<<binarySearch(1,(ull)cp*(ull)q);
}