https://leetcode.cn/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,找出返回能满足 f (x) = k 的非负整数 x 的数量。 示例 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\)

# 题解

根据题意,只有因子 2 和 5 相乘能得到以 0 为结尾的数。 又因为 2 出现次数远大于 5,因此只需求 5 为因子出现的次数(25 及类似的要记多次),也可分析出所求其实只有 0 和 5 两种结果。(官方代码)

class Solution {
public:
int zeta(long x) {
int res = 0;
while (x) {
res += x / 5;
x /= 5;
}
return res;
}

long long help(int k) {
long long r = 5LL * k;
long long l = 0;
while (l <= r) {
long long mid = (l + r) / 2;
if (zeta(mid) < k) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return r + 1;
}

int preimageSizeFZF(int k) {
return help(k + 1) - help(k);
}
};

复杂度分析:

  • 时间复杂度:\(O (log^2k)\)
  • 空间复杂度:\(O (1)\)