怎么做网站关键词优化免费发布软文广告推广平台
题目:满足 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;
}