【二分】个人练习-Leetcode-793. Preimage Size of Factorial Zeroes Function

求解阶乘零个数逆问题

题目链接: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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值