本文已参与「新人创作礼」活动,一起开启掘金创作之路。
阶乘函数后 K 个零
示例 1:
输入:k = 0
输出:5
解释:0!, 1!, 2!, 3!, 和 4! 均符合 k = 0 的条件。
示例 2:
输入:k = 5
输出:0
解释:没有匹配到这样的 x!,符合 k = 5 的条件。
示例 3:
输入: k = 3
输出: 5
数据范围:
0 <= k <= 10^9
思路
阶乘末尾的0如何求出?
显然,0的个数和 中的 有关
每出现一对这样的数,就多一个0
2 需要考虑吗?
2出现的次数一定比5出现的次数多,这个是毋庸置疑
所以就可以把问题转化为 看5的幂次 如何比较快的求出来呢
考虑这样的算式
就可以把x里面的因子全部除干净
因为这个等价于
算出来以后就知道当前数的阶乘的0有多少个了
然后,我们就可以二分去找到最接近的一个数了
显然二分也存在这样一种情况,我找不到这个数,并不存在0为x的数 这个时候返回0即可 若是找到了这个样子的一个数,那么这样的数必定不会超过5个
因为 所以成立条件的最大的数字应该只能有5个数字
二分的时候有很多种形式,这里我采取的是逼近他的下届,其实若是逼近上界也是一样的。
且本体的答案有一点数论分块的意思
所以上界下届都可
代码
class Solution {
public:
int preimageSizeFZF(int k) {
#define int long long
int l = 0, r = 5e9;
auto get = [](auto&& self, int x) -> int {
if (x / 5) return x / 5 + self(self, x / 5);
else return 0;
};
while (l < r) {
int x = l + r >> 1;
if (get(get, x) < k) l = x + 1;
else r = x;
}
if (get(get, r) == k) return 5;
#undef int
return 0;
}
};