Pagini recente » Cod sursa (job #3661) | Cod sursa (job #2285546) | Cod sursa (job #3120622) | Cod sursa (job #772493) | Cod sursa (job #2794765)
#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);
}