Cod sursa(job #2794765)

Utilizator db_123Balaban David db_123 Data 5 noiembrie 2021 13:23:19
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 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;
 
bitset <MaxPrimeNumber> ciur;
 
ui p,q,primeNumbers[4653]= {1,2},fact[20],exp[20],dim,cp;
 
//4647
bool esteFactorialEgalcuP(ull  val)
{
    for (ui i=1;i<=dim;++i)
    {
        ull cnt=0,lim=exp[i]*q;
        for (ull j=fact[i];j<=val && cnt<lim;j*=fact[i])
            cnt+=val/j;
 
        if (cnt<lim)
            return 0;
    }
    return 1;
}
ull binarySearch(ull left, ull right)
{
    ull  sol;
    while (left<=right){
        ull mid=(left+right)/2;
        if (esteFactorialEgalcuP(mid))
        {
            sol=mid;
            right=mid-1;
        }
        else
            left=mid+1;
    }
    return sol;
}
int main()
{
    ///build ciur
    for (int i=3; i<=MaxPrimeNumber; i+=2)
    {
        if (!ciur[i])
        {
            /// primeNumbers[0] how many prime numbers
            primeNumbers[++primeNumbers[0]]=i;
            for (int j=i*i; j<=MaxPrimeNumber; j+=i*2)
                ciur[j]=1;
        }
    }
 
    /*
    for(int i = 0 ; i < primeNumbers[0] ; i++)
    {
        cout << " prime["<<i << "]" << primeNumbers[i] << endl;
    }
    for(int i = 0 ; i < primeNumbers[0] ; i++)
    {
        cout << " ciur["<<i << "]" << ciur[i] << endl;
    }
    */
    //return 0;
    cin>>p>>q;
    cp=p;
    /// descompunem numarul p in factori primi
    /// decompose p number in prime numbers factors
    for (ui i=1;i<=primeNumbers[0] && primeNumbers[i]*primeNumbers[i]<=p;++i)
    {
        if (p%primeNumbers[i])
            continue;
        fact[++dim]=primeNumbers[i];
        for (;p%primeNumbers[i]==0;p/=primeNumbers[i]) exp[dim]++;
    }
    if (p>1){ /// prime number
        fact[++dim]=p;
        exp[dim]=1;
    }
 
    //cout << endl<<"DIM:"<< dim << endl;
 
    cout<<binarySearch(1,1ULL*cp*q);
}