Pagini recente » Cod sursa (job #2442887) | Cod sursa (job #687948) | Cod sursa (job #1666677) | Cod sursa (job #2628751) | Cod sursa (job #1914980)
#include <cstdio>
using namespace std;
int p,q;
struct data
{
int p,ex;
}des[100001];
int descompunere(int n)
{
int d=2,e,nr=0;
while(d*d<=n && n>1)
{
e=0;
while(n%d==0)
{
n=n/d;
e++;
}
if(e)
{
des[++nr].p=d;
des[nr].ex=e*q;
}
d++;
}
if(n>1)
{
des[++nr].p=n;
des[nr].ex=q;
}
}
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 cautbin(int poz)
{
long long st,dr,med,last,ans;
int k=des[poz].p;
st=1;
dr=1LL<<62;
while(st<=dr)
{
med=dr-(dr-st)/2;
ans=legendre(k,med);
if(ans>=des[poz].ex)
{
last=med;
dr=med-1;
}
else
st=med+1;
}
return last;
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
int i,stare=0,j;
long long rezaux,max=-101;
scanf("%d%d",&p,&q);
descompunere(p);
for(i=1;des[i].ex!=0;i++)
{
rezaux=cautbin(i);
if(rezaux>max)
max=rezaux;
}
printf("%lld",max);
return 0;
}