Pagini recente » Cod sursa (job #1453640) | Istoria paginii runda/ff | Cod sursa (job #2034669) | Cod sursa (job #2521774) | Cod sursa (job #2632840)
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
ifstream f("gfact.in");
ofstream g("gfact.out");
long long fact[50000],putere[50000],rez;
long long verif(long long nrdiv, long long q, long long b)
{
for (long long i=1; i<=nrdiv; i++)
{
long long factor=fact[i];
long long aux=b;
long long nrp=0;
while (aux>0)
{
nrp=nrp+(aux/factor);
aux=aux/factor;
}
if (nrp < putere[i]*q)
{
return 0;
}
}
return 1;
}
void caut_bin(long long nrdiv, long long q, long long p)
{
long long st=1,dr=(long long)1 << 60;
while (st <= dr)
{
long long mij=(st+dr)/2;
if (verif(nrdiv,q,mij) == 1)
{
rez=mij;
dr=mij-1;
}
else
{
st=mij+1;
}
}
}
int main()
{
long long p,q,nrdiv=0,d,put;
f>>p>>q;
d=2;
while (d*d <= p)
{
put=0;
while (p%d==0)
{
p=p/d;
put=put+1;
}
if (put>0)
{
nrdiv=nrdiv+1;
fact[nrdiv]=d;
putere[nrdiv]=put;
}
d=d+1;
}
if (p>1)
{
nrdiv=nrdiv+1;
fact[nrdiv]=p;
putere[nrdiv]=1;
}
caut_bin(nrdiv, q, p);
g<<rez<<'\n';
return 0;
}