Pagini recente » Cod sursa (job #671373) | Cod sursa (job #1388425) | Cod sursa (job #2273202) | Cod sursa (job #1034560) | Cod sursa (job #3234025)
#include <bits/stdc++.h>
using namespace std;
bitset <45000> e;
int p[45000],prime,divz,ex;
using ll=long long;
struct divizori
{
int val,exp;
}d[45000];
void era()
{
for(int i=2; i<=45000; i++)
if(!e[i])
{
p[++prime]=i;
for(int j=i;(ll)i*j<=45000;j++)
e[i*j]=1;
}
}
void desc(int n)
{
int pos=1;
while((ll)p[pos]*p[pos]<=n && pos<=prime)
{
int exp=0;
while(n%p[pos]==0)
{
n/=p[pos];
exp++;
}
if(exp)
d[++divz]={p[pos],exp};
pos++;
}
if(n!=1)
d[++divz]={n,1};
}
bool check(ll val)
{
for(int i=1;i<=divz;i++)
{
ll cnt=0;
ll vall=val;
while(vall/d[i].val)
{
cnt+=vall/d[i].val;
vall/=d[i].val;
}
if(cnt<d[i].exp*ex)
return false;
}
return true;
}
ll cb()
{
ll st=0,dr=(ll)d[divz].val*d[divz].exp*ex,mid,r=-1;
while(st<=dr)
{
mid=(st+dr)/2;
if(check(mid))
{
r=mid;
dr=mid-1;
}
else st=mid+1;
}
return r;
}
int main()
{
ifstream fin("gfact.in");
ofstream fout("gfact.out");
int b;
fin>>b>>ex;
era();
desc(b);
fout<<cb();
return 0;
}