Pagini recente » Cod sursa (job #1606989) | Cod sursa (job #8154) | Cod sursa (job #431219) | Cod sursa (job #3187526) | Cod sursa (job #2355639)
#include <fstream>
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
int mn,k,st,ok,p,q;
struct chestie{
int e,nr;
}fact[100];
long long dr,mij,rez;
bool verif(long long x);
void scanandprec();
long long power(int x,int e);
int main()
{
scanandprec();
st=p;
dr=q*p;
while(st<=dr)
{
mij=(st+dr)/2;
ok=verif(mij);
if(ok==1)
{
rez=mij;
dr=mij-1;
}
else st=mij+1;
}
cout<<rez<<'\n';
return 0;
}
long long power(int x,int e)
{
if(e==0)
return 1;
long long P=power(x,e/2);
if(e%2==1)
return P*P*x;
return P*P;
}
bool verif(long long x){
long long pp,rasp,NR,init;
mn=2000000000;
for(int i=1;i<=k;i++)
{
NR=init=power(fact[i].nr,fact[i].e);
rasp=0;
while(NR<=x)
rasp+=(x/NR),NR=NR*init;
if(rasp<mn)
mn=rasp;
}
if(mn>=q)
return 1;
return 0;
}
void scanandprec()
{
cin>>p>>q;
k=0;
int n=p;
if(n%2==0)
{
++k;
while(n%2==0&&n)
fact[k].e++,n/=2;
fact[k].nr=2;
}
for(int d=3; d*d<=n; d+=2)
if(n%d==0)
{
++k;
while(n%d==0&&n)
fact[k].e++,n/=2;
fact[k].nr=d;
}
if(n>1)
fact[++k].nr=n,fact[k].e=1;
}