题目链接:https://leetcode.cn/problems/preimage-size-of-factorial-zeroes-function/description/
题目大意:设f(x)
是【表示x!
末尾0的个数的函数】,给出一个k
,求满足f(x)=k
的x
的个数。
思路:明显,x!
末尾0的个数就是从1
到x
中,因数5
的个数。要注意25
,125
这样的数,一个数中就带有两个因数5
。因此,到这一步的时候就会【一次性往结果最后增加多个0
】。就会出现例子中的,使得f(x)=5
的x
不存在的情况。因为0
的个数直接从4个跳到6个了。
显然,结果要么是0
要么是5
。
想要最后结果有k
个0
,x
的一个上界是5*k
,因为1
到5*k
中一定有k
个因数5。Leetcode上有题解在数学上证明了一个下界是4*k
。于是使用二分法,在[4*k, 5*k]
中找一个数mid
,如果它的因数5的数量等于k
了,那么就找到了,否则找不到。
完整代码
class Solution {
public:
int preimageSizeFZF(int k) {
if (k == 0)
return 5;
long K = (long)k;
long l = 4*K, r = 5*K;
while (l <= r) {
long mid = (r-l)/2 + l;
int s = 0;
long tmp = mid;
while (tmp) {
tmp /= 5;
s += tmp;
}
if (s == K)
return 5;
if (s < K)
l = mid + 1;
else
r = mid - 1;
}
return 0;
}
};