蓝桥杯2022年第十三届省赛真题-求阶乘
题目:满足 N! 的末尾恰好有 K 个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 −1。
对于 30% 的数据,1 ≤ K ≤ 10^6 .
对于 100% 的数据,1 ≤ K ≤10^18 .
思路:可以看到数据范围很大,如果求阶乘枚举,是不可能的。
0是由2*5才能出现,所以寻找因子2和5,又由于因子2的频率远远大于5的频率,因此寻找因子5的频率
如寻找k=2时,那么n=10;因为10的阶乘中5的因子有两个分别是10和5
如果之间输出25不行吗?答案是不行,k5一定行,但不保证是最小的,如当k=6时,为30的阶乘后面一定有6个0,但不是最小的,其中25的阶乘也可以,因为25=5*5提供了两个5因子。
所以进行二分查找范围1-k*5;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k;
ll ans=-1;
ll check(ll n)
{
//因子5的个数
ll cnt=0;
while(n)
{
cnt+=n/5;
n=n/5;
}
return cnt;
}
int main(void)
{
cin>>k;
ll l=1;
ll r=5*k+2;
while(l<=r)
{
ll mid=(r+l)/2;
if(check(mid)>=k)
{
r=mid-1;
if(check(mid)==k)
ans=mid;
}
else l=mid+1;
}
cout<<ans;
return 0;
}