题目链接: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;
}
};