Pagini recente » Cod sursa (job #2832371) | Cod sursa (job #2392486) | Cod sursa (job #1139487) | Cod sursa (job #1298642) | Cod sursa (job #935446)
Cod sursa(job #935446)
#include<stdio.h>
#include<math.h>
long long p,q,b,dim,fact[1000][2];
void init()
{long long i,lim,pow,k;
k=2; lim=2*(long long)sqrt(p);
while (p!=1)
if (p%k==0)
{ pow=0;
while (p%k==0) { pow++; p/=k; }
dim++; fact[dim][0]=k; fact[dim][1]=pow; }
else if (k<=lim) (k==2)?(k=3):(k+=2);
else { fact[++dim][0]=p; fact[dim][1]=1; p/=p; }
for (i=1;i<=dim;i++) fact[i][1]*=q; }
long long max(long long a,long long b)
{if (a>b) return a;
else return b; }
long long deter(long long x,long long a)
{long long nr=0;
while (x!=0) nr+=(x/=a);
return nr; }
long long search(long long st,long long dr,long long a,long long b) //a-nr prim, b-puterea la care apare
{long long m,apar;
if (st<dr)
{ m=(st+dr)/2;
apar=deter(m,a)+m;
if (apar==b) return m;
else if (b<apar) return search(st,m-1,a,b);
else return search(m+1,dr,a,b); }
else return st;
}
int main()
{long i;
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%lld%lld",&p,&q);
if (p==1) b=1;
init();
for (i=1;i<=dim;i++)
b=max(b,search(1,fact[i][1],fact[i][0],fact[i][1])*fact[i][0]);
printf("%lld\n",b);
fclose(stdin); fclose(stdout);
return 0; }