Pagini recente » Cod sursa (job #894300) | Cod sursa (job #707467) | Cod sursa (job #432497) | Cod sursa (job #152735) | Cod sursa (job #1909428)
#include <cstdio>
#include <bitset>
using namespace std;
long long le(long long x , int k)
{
long long tot=0;
long long prod=k;
while(prod<=x)
{
tot+=x/prod;
prod=1LL*prod*k;
}
return tot;
}
bitset<200005>a;
int v[10],exp[10];
long long pr1[10],pr2[10];
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
int i ,j;
a[0]=a[1]=1;
for(i=4;i<=200000;i+=2)a[i]=1;
for(i=3;i * i <=200000;i+=2)
if(!a[i])
for(j=i*i;j<=200000;j+=2*i)a[j]=1;
int max=0,e=0,q,n,cnt=0;
scanf("%d%d",&n,&q);
while(n>1&&n%2==0)
{
e++;
n/=2;
}
if(e)
{
v[++cnt]=2;
exp[cnt]=e*q;
}
for(i=3;i<=200000;i+=2)
{
if(i*i>n)break;
if(!a[i])
{
int nr=i;
e=0;
while(n>1&&n%nr==0)
{
e++;
n/=nr;
}
if(e)
{
v[++cnt]=nr;
exp[cnt]=e*q;
}
}
}
if(n>1)
{
v[++cnt]=n;
exp[cnt]=q;
}
long long st=1;
long long dr=50000000000;
for(i=1;i<=cnt;i++)
{
max=v[i];st=1;
dr=50000000000;
while(st<dr)
{
long long mij=(dr-st)/2+st;
long long x=le(mij,max);
if(x<exp[i])st=mij+1;
if(x>exp[i])dr=mij-1;
if(x==exp[i])
dr=mij;
}
pr1[i]=st;
}
max=0;
long long max1=0;
for(i=1;i<=cnt;i++)if(pr1[i]>max1)max1=pr1[i];
printf("%lld",max1);
return 0;
}