题目描述
满足 N! 的末尾恰好有 K 个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 −1。
输入格式
一个整数 K。
输出格式
一个整数代表答案。
样例输入
复制
2
样例输出
复制
10
提示
对于 30% 的数据,1 ≤ K ≤ 106 .
对于 100% 的数据,1 ≤ K ≤ 1018 .
个人分析
这个题目要注意 因为要求N! 的末尾恰好有 K 个 0
所以就要知道N!末尾的0怎么来的 因为2*5=10这就有一个0 而在阶乘中 2的数量一定是远大于5的数量的 所以求末尾的0也就是算有多少个5的因子
例如:20! 就只需要让20不断÷5 并且将每次÷5的得数加起来
20÷5=4
4 ÷5= 0
故共有4+0=4个5的因子 也就是有4个0
然后用二分查找的方法从0到1e19不断搜索哪个数的阶乘满足末尾有K个0
因为数越大 才越有可能出现多个0
所以搜索的时候 如果遇到比K小 那么就缩左边界 比K大 就缩右边界
题解代码
#include<iostream>
using namespace std;
long long int k;
long long int check(long long int num)
{
long long int ans = 0;
while (num != 0)
{
ans = ans + num / 5;
num = num / 5;
}
return ans;
}
int main()
{
scanf("%lld", &k);
long long int le = 0;
long long int ri = 1e19;
long long int mid= 0;
while (le < ri)
{
mid = (le + ri) / 2;
if (check(mid) >= k)
{
ri = mid;
}
else
{
le = mid + 1;
}
}
if (check(le) == k)
{
cout << le << endl;
}
else
{
cout << "-1" << endl;
}
return 0;
}