Back to all solutions

#793 - Preimage Size of Factorial Zeroes Function

Problem Description

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 two zeroes at the end.

Given an integer k, return the number of non-negative integers x have the property that f(x) = k.

Solution

/**
 * @param {number} k
 * @return {number}
 */
var preimageSizeFZF = function(k) {
  return findUpperBound(k) - findLowerBound(k);
};

function findLowerBound(k) {
  let left = 0;
  let right = 5 * (10 ** 10);

  while (left < right) {
    const mid = Math.floor((left + right) / 2);
    const zeroes = countTrailingZeroes(mid);

    if (zeroes < k) {
      left = mid + 1;
    } else {
      right = mid;
    }
  }

  return left;
}

function findUpperBound(k) {
  let left = 0;
  let right = 5 * (10 ** 10);

  while (left < right) {
    const mid = Math.floor((left + right) / 2);
    const zeroes = countTrailingZeroes(mid);

    if (zeroes <= k) {
      left = mid + 1;
    } else {
      right = mid;
    }
  }

  return left;
}

function countTrailingZeroes(n) {
  let count = 0;
  let powerOfFive = 5;

  while (n >= powerOfFive) {
    count += Math.floor(n / powerOfFive);
    powerOfFive *= 5;
  }

  return count;
}