目录

LC 793. 阶乘函数后 K 个零 (opens new window) (opens new window)

困难

# 问题描述

f(x)x! 末尾是 0 的数量。回想一下 x! = 1 * 2 * 3 * ... * x,且 0! = 1

  • 例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 ;而 f(11) = 2 ,因为 11! = 39916800 末端有 2 个 0 。

给定 k,找出返回能满足 f(x) = k 的非负整数 x 的数量。

示例 1:

输入:k = 0
输出:5
解释:0!, 1!, 2!, 3!, 和 4! 均符合 k = 0 的条件。

示例 2:

输入:k = 5
输出:0
解释:没有匹配到这样的 x!,符合 k = 5 的条件。

示例 3:

输入: k = 3
输出: 5

提示:

  • 0 <= k <= 109

# 数学

1010进制中,只有2255相乘才会得到1010,就是在阶乘过程中,一对2255会在末尾产生一个00,因为因子22的个数总比因子55多,因此,阶乘末尾00的个数等价于因子55的个数。 由于 2525125125这样的数能够拆解成多个因子55,按这些特殊的数划分成不同的档次,找出刚好大于等于 kk 的档次,然后循环往下降档,看kk是否满足某个档次边界减一,若满足,则说明阶乘不可能满足该条件,返回00

/**
 * @param {number} k
 * @return {number}
 */
var preimageSizeFZF = function (k) {
  let max = 1
  while (max < k) {
    max = max * 5 + 1
  }
  while (max > 1) {
    if (max - 1 === k) return 0
    max = (max - 1) / 5
    k %= max
  }
  return 5
}
  • 时间复杂度:O(logk)O(\log{k})
  • 空间复杂度:O(1)O(1)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!