Pagini recente » Cod sursa (job #517533) | Cod sursa (job #218081) | Borderou de evaluare (job #3118045) | Cod sursa (job #627738) | Cod sursa (job #2795144)
#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=100000;//44723;//48611;//5000th prime number
bitset <MaxPrimeNumber> ciur;
ui p,q,primeNumbers[70000]= {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);
}