调换 47 行和 49 行也能过样例
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+5;
ll yinshu[maxn],cnt[maxn];
int top;
ll k;
ll calc(ll a,ll b)
{
ll sum=0;
while(a)
{
sum+=a/b;
a/=b;
}
return sum;
}
bool check(ll k,ll n)
{
for(int i=1;i<=top;i++)
{
if(calc(n,yinshu[i])<cnt[i])
{
return 0;
}
}
return 1;
}
int main()
{
scanf("%lld",&k);
ll temp=k;
for(ll i=2;i*i<=k;i++)
{
if(k%i==0)yinshu[++top]=i;
while(k%i==0)
{
k/=i;
cnt[top]++;
}
}
if(k!=1)
{
yinshu[++top]=k;
cnt[top]++;
}
k=temp;
ll ans=k;
ll l=2,r=k+1;
while(l<r)
{
ll mid=(l+r)>>1;
// printf("l: %lld r: %lld mid: %lld\n",l,r,mid);
if(check(k,mid))
{
ans=mid;
r=mid;
}
else l=mid+1;
}
printf("%lld",ans);
return 0;
}