Pagini recente » Cod sursa (job #2155149) | Cod sursa (job #1863864) | Cod sursa (job #716928) | Cod sursa (job #1262948) | Cod sursa (job #1909717)
#include<cstdio>
int p[100000],ex[100000];
void descompunere(int n)
{
int d,i,e;
d=2;
i=0;
while(d*d<=n&&n>1)
{
e=0;
while(n%d==0)
{
n/=d;
e++;
}
if(e){
p[++i]=d;
ex[i]=e;
}
d++;
}
if(n>1){
p[++i]=n;
ex[i]=1;
}
}
long long legendre(int k,long long n)
{
long long numitor=k,s=0;
while(numitor<=n)
{
s=s+n/numitor;
numitor=numitor*k;
}
return s;
}
long long bs(int poz)
{
long long st,dr,med,last,ans;
int k=p[poz];
st=1;dr=1LL<<62;
while(st<=dr)
{
med=dr-(dr-st)/2;
ans=legendre(k,med);
if(ans>=ex[poz])
{
last=med;
dr=med-1;
}
else
st=med+1;
}
return last;
}
int main(){
int p,q,i;
long long nr,max;
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%d%d",&p,&q);
descompunere(p);
i=1;
while(ex[i]!=0)
{
ex[i]*=q;
i++;
}
i=1;
max=-1;
while(ex[i]!=0)
{
nr=bs(i);
if(nr>max)
max=nr;
i++;
}
printf("%lld",max);
return 0;
}