题目链接
https://leetcode-cn.com/problems/preimage-size-of-factorial-zeroes-function/
描述
f(x) 是 x! 末尾是0的数量。(回想一下 x! = 1 * 2 * 3 * ... * x,且0! = 1)
例如, f(3) = 0 ,因为3! = 6的末尾没有0;而 f(11) = 2 ,因为11!= 39916800末端有2个0。给定 K,找出多少个非负
整数x ,有 f(x) = K 的性质。
注意:
K是范围在 [0, 10^9] 的整数。
示例
示例 1:
输入:K = 0
输出:5
解释: 0!, 1!, 2!, 3!, and 4! 均符合 K = 0 的条件。
示例 2:
输入:K = 5
输出:0
解释:没有匹配到这样的 x!,符合K = 5 的条件。
初始代码模板
class Solution {
public int preimageSizeFZF(int K) {
}
}
代码
虽然题目是困难标签,其实难度并不高。分解题目内容,其实问题也就是n!后多少个零以及二分的运用。
很容易想到遍历,一直遍历到某个数的阶乘后的零大于K。
但是这个阶乘后的零是单调递增的,没必要遍历,直接使用二分即可。
况且分析阶乘后k个零的算法,多少个零与n中5的个数有关,所以一个数n的阶乘后的零为K个,那么应该是有5个数的阶乘后的零都为K个。
否则没有任何符合规定的数字。
推荐题解:
https://labuladong.gitbook.io/algo/suan-fa-si-wei-xi-lie/3.4-shu-xue-yun-suan-ji-qiao/jie-cheng-ti-mu
class Solution {
public int preimageSizeFZF(int K) {
long k = K;
long lo = k;
long hi = 5 * k + 1;
while (lo <= hi) {
long mid = lo + (hi - lo) / 2;
long num = count(mid);
if (num > k) {
hi = mid - 1;
} else if (num < k) {
lo = mid + 1;
} else {
return 5;
}
}
return 0;
}
private long count(long n) {
if (n == 0) {
return 0;
}
return n / 5 + count(n / 5);
}
}