Cod sursa(job #2795128)

Utilizator db_123Balaban David db_123 Data 5 noiembrie 2021 23:47:51
Problema GFact Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.13 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=48611;//5000th prime number

bitset <MaxPrimeNumber> ciur;

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

//este factorial de b multiplu de p la q ?
bool isValid(ull  b)
{
    //cout << "searching binary ... daca " << b << "! este multiplu de " << cp << " la puterea " << q <<endl;
    for (ui i=1;i<=dim;++i)
    {
        ull cnt=0,minLimit=exp[i]*q;
        //cout << "how many time do we have " << base[i] << " in " << b << endl;
        //cout << "      expTotal : " << minLimit << " baza :  " <<base[i] << " b : "<< b << " cnt :" << cnt <<endl;
        for (ull j=base[i];j<=b && cnt<minLimit;j*=base[i])
        {
            //cout << "         j : " << j << " cnt : "<< cnt << endl;
            cnt+=b/j;;
        }

        //cout << "       we have  " << base[i] << " in " << b << " " << cnt << " times  exponentTotal " << q << " x " << exp[i] << endl;
        if (cnt < minLimit)
        {
            //cout << "nu este o solutie" << endl;
            return 0;
        }

    }
    //cout <<"este o solutie "<< endl << endl;
    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
    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*i; j<=MaxPrimeNumber; j+=i*2)
            {
                //cout <<" i : "<< i << " j : " <<j << endl;
                ciur[j]=1;
            }

        }
    }
    //cout << "ciur ok" << endl;

    //for (ull i=0; i<5000; i++)
    //{
    // cout <<"primeNumber i : " << i << " = " << primeNumbers[i]<<endl;
    //}
    //return 0;
    /*
    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;
        base[++dim]=primeNumbers[i];
        for (;p%primeNumbers[i]==0;p/=primeNumbers[i]) exp[dim]++;
    }
    if (p>1){ /// prime number
        base[++dim]=p;
        exp[dim]=1;
    }

    //cout << endl<<"DIM:"<< dim << endl;
    //cout << endl<<"Numar baze ....."<< endl;
    //for (int i=1;i<=dim;++i)
    //{
    //    cout<< "i : "<<i<<" baza : "<<base[i] << " exp : "<< exp[i]<<endl;
    //}

    cout<<binarySearch(1,(ull)cp*(ull)q);
}