个人技术分享

题目链接:https://leetcode.cn/problems/preimage-size-of-factorial-zeroes-function/description/

题目大意:设f(x)是【表示x!末尾0的个数的函数】,给出一个k,求满足f(x)=kx的个数。

思路:明显,x!末尾0的个数就是从1x中,因数5的个数。要注意25125这样的数,一个数中就带有两个因数5。因此,到这一步的时候就会【一次性往结果最后增加多个0】。就会出现例子中的,使得f(x)=5x不存在的情况。因为0的个数直接从4个跳到6个了。

显然,结果要么是0要么是5

想要最后结果有k0x的一个上界是5*k,因为15*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;
    }
};