Pagini recente » Cod sursa (job #2107250) | Cod sursa (job #703175) | Arhiva de probleme | Cod sursa (job #1283899) | Cod sursa (job #331247)
Cod sursa(job #331247)
#include <cstdio>
#include <cmath>
#include <climits>
long long v[3000000];
long long descomp(long long x)
{long long nr=0,i;
for (i=1;i<=v[0]&&v[i]<=x;++i)
nr+=x/v[i];
return nr;
}
int main()
{long long sol=LONG_LONG_MAX,x,y,z,w,p,q,maxdiv=0,exp,i,expp;
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%lld %lld",&p,&q);
scanf("%lld %lld",&p,&q);
x=1;y=p*q;
for (i=2;i<=sqrt(p)&& p>1;i++)
{exp=0;
while (p%i==0)
{p=p/i;
exp++;
if (exp!=0) {maxdiv=i;expp=exp;}
}
}
if (p!=1) if (p>maxdiv) {maxdiv=p;exp=1;}
exp*=q;
for (i=2,v[1]=maxdiv,v[0]=1;v[v[0]]*maxdiv<=y;i++)
{v[i]=v[i-1]*maxdiv; ++v[0];}
while (x<=y)
{z=(x+y)/2;
w=descomp(z);
if (w<exp) x=z+1; else
if (w>=exp) {y=z-1;if (z<sol) sol=z;}
}
printf("%lld",sol);
//printf("%d %d",maxdiv,exp);
return 0;}