Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/793.html

793. Preimage Size of Factorial Zeroes Function (Hard)

Let f(x) be the number of zeroes at the end of x!. (Recall that x! = 1 * 2 * 3 * ... * x, and by convention, 0! = 1.)

For example, f(3) = 0 because 3! = 6 has no zeroes at the end, while f(11) = 2 because 11! = 39916800 has 2 zeroes at the end. Given K, find how many non-negative integers x have the property that f(x) = K.

Example 1:
Input: K = 0
Output: 5
Explanation: 0!, 1!, 2!, 3!, and 4! end with K = 0 zeroes.

Example 2:
Input: K = 5
Output: 0
Explanation: There is no x such that x! ends in K = 5 zeroes.

Note:

  • K will be an integer in the range [0, 10^9].

Companies:
Amazon

Solution 1.

  • class Solution {
        public int preimageSizeFZF(int K) {
            long low = 0, high = (long) K * 5;
            while (low <= high) {
                long mid = (high - low) / 2 + low;
                long endZeroes = endZeroes(mid);
                if (endZeroes == K)
                    return 5;
                else if (endZeroes > K)
                    high = mid - 1;
                else
                    low = mid + 1;
            }
            return 0;
        }
    
        public long endZeroes(long num) {
            long zeroes = 0;
            while (num > 0) {
                num /= 5;
                zeroes += num;
            }
            return zeroes;
        }
    }
    
    ############
    
    class Solution {
        public int preimageSizeFZF(int k) {
            return g(k + 1) - g(k);
        }
    
        private int g(int k) {
            long left = 0, right = 5 * k;
            while (left < right) {
                long mid = (left + right) >> 1;
                if (f(mid) >= k) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return (int) left;
        }
    
        private int f(long x) {
            if (x == 0) {
                return 0;
            }
            return (int) (x / 5) + f(x / 5);
        }
    }
    
  • // OJ: https://leetcode.com/problems/preimage-size-of-factorial-zeroes-function/
    // Time: O((logK)^2)
    // Space: O(1)
    class Solution {
    private:
        int getZeros(int i) {
            int ans = 0;
            while (i) {
                ans += i;
                i /= 5;
            }
            return ans;
        }
    public:
        int preimageSizeFZF(int K) {
            if (!K) return 5;
            int i = 1;
            while (getZeros(i) < K) i *= 5;
            int L = i / 5, R = i;
            while (L <= R) {
                int M = (L + R) / 2;
                int z = getZeros(M);
                if (z == K) return 5;
                if (z < K) L = M + 1;
                else R = M - 1;
            }
            return 0;
        }
    };
    
  • class Solution:
        def preimageSizeFZF(self, k: int) -> int:
            def f(x):
                if x == 0:
                    return 0
                return x // 5 + f(x // 5)
    
            def g(k):
                return bisect_left(range(5 * k), k, key=f)
    
            return g(k + 1) - g(k)
    
    
    
  • func preimageSizeFZF(k int) int {
    	f := func(x int) int {
    		res := 0
    		for x != 0 {
    			x /= 5
    			res += x
    		}
    		return res
    	}
    
    	g := func(k int) int {
    		left, right := 0, k*5
    		for left < right {
    			mid := (left + right) >> 1
    			if f(mid) >= k {
    				right = mid
    			} else {
    				left = mid + 1
    			}
    		}
    		return left
    	}
    
    	return g(k+1) - g(k)
    }
    

All Problems

All Solutions