Pagini recente » Cod sursa (job #2414509) | Cod sursa (job #2313185) | Cod sursa (job #161542) | Cod sursa (job #1722509) | Cod sursa (job #469355)
Cod sursa(job #469355)
#include<stdio.h>
#include<math.h>
long f[40001];
long p[40001];
long multi (long b,long i)
{
long numitor,m=0;
numitor=f[i];
while (b/numitor)
{
m+=b/numitor;
numitor=numitor*f[i];
}
return m;
}
long cautbin(long st , long dr , long i)
{
long m,poz;
while (st<=dr)
{
m=(st+dr)/2;
if (multi(m,i)>=p[i])
{
dr=m-1;
poz=m;
}
else
st=m+1;
}
return poz;
}
int main()
{
long pu,q,b,d,lim,e,u=0,max,i;
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%ld%ld",&pu,&q);
d=2;
e=0;
while (pu%d==0)
{
pu=pu/d;
e++;
}
if (e)
{
f[++u]=d;
p[u]=e*q;
}
d++;
lim=sqrt(pu);
while (d<=lim && pu>1)
{
e=0;
while (pu%d==0)
{
pu=pu/d;
e++;
}
if (e)
{
f[++u]=d;
p[u]=e*q;
}
d=d+2;
}
if (pu>1)
{
f[++u]=pu;
p[u]=q;
}
max=-1;
for (i=1;i<=u;i++)
{
b=cautbin(1,((1<<31)-1),i);
if (b>max)
max=b;
}
b=max;
printf("%ld\n",b);
return 0;
}