Cod sursa(job #349180)
#include<fstream>
using namespace std;
long long p,q,a,b;
long long cautare(long long l,long long r,long long div,long long putere);
int main()
{freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%ld %ld",&p,&q);
char prim[2000005];; int nr=0;
for(int i=2;i<=p;i++) prim[i]=1;
for(int i=2;i<=p;i++)
{if(prim[i]) {nr++;for(int j=i+i;j<=p;j+=i) prim[j]=0;}
}
long long aux=p;
long long div[5003],puteri[5003]; long long nrdiv=0;
if (aux==2) {div[1]=2;nrdiv=1;puteri[1]=1;}
else if(aux==3) {div[1]=3;nrdiv=1;puteri[1]=1;}
else
for(int k=2;k*k<=aux;k++)
{
if(prim[k]==1 && aux%k==0)
{nrdiv++;div[nrdiv]=k;int contor;puteri[nrdiv]=1;aux/=k;
while(aux%k==0) {puteri[nrdiv]++;aux/=k;}
}
}
if(aux!=1) {nrdiv++;div[nrdiv]=aux;puteri[nrdiv]=1;}
long long candidat=0;
for(int i=1;i<=nrdiv;i++)
{ //printf("%ld %ld \n",div[i],puteri[i]);
long long cand_aux=cautare(1,q*puteri[i],div[i],puteri[i]*q);
//printf("%ld \n",cand_aux);
long long val=cand_aux*div[i];
if(val>candidat) candidat=val;
}
printf("%ld",candidat);
return 0;}
long long cautare(long long l,long long r,long long div,long long putere)
{if(l<=r)
{long long mij=(l+r)/2;
long long aux2=div*mij;
long long sum=0;
long long imp=div;
sum=0;
while((aux2/imp)!=0) {sum+=(aux2/imp);imp*=imp;}
if(sum==putere) {return mij;}
if(sum<putere) {return cautare(mij+1,r,div,putere);}
else return cautare(l,mij-1,div,putere);
}
}