题目描述

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 的数量。

来源:力扣(LeetCode)

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

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

本体并非给定一个n!,来求解最后n!有多少个0,而是问满足给定一个k,有多少个x!可以满足X!最后的0的个数为k。

在【172. 阶乘后的零】中我们学会了使用容斥原理来求解n!后面的0的个数,那么在本题中就可以使用这样一种思路:

  • 我们记函数maxValueSatisfyZeroCount(k)能求解出满足阶乘后结果中末尾0的个数小于等于k的最大的数为多少

    • 比如1!, 2!, 3!, 4!都满足最后的0的个数为小于等于0个,那么这个maxValueSatisfyZeroCount(0)会返回4
  • 那么本题的解可以转化为maxValueSatisfyZeroCount(k) - maxValueSatisfyZeroCount(k-1)
  • 我们如何寻找这个符合条件的最大值呢?
    • 最朴素的想法是我们从0到n遍历所有数,使用容斥原理对每个数进行求解,知道找到最大的符合条件的值为止。
    • 实际上我们可以用二分查找来加速这一过程,因为n!后零的数量与n的增长实际上是呈单调关系的,满足二分查找的基本使用条件。

代码

golang
func preimageSizeFZF(k int) int {
if k <= 1 {
return 5
}
return maxValueSatisfyZeroCount(k) - maxValueSatisfyZeroCount(k-1)
} func maxValueSatisfyZeroCount(zeroTarget int) int {
l, r := 0, int(10e10)
for l < r {
mid := (l + r + 1) / 2
if countZeros(mid) <= zeroTarget { //we shrink left to find maxValue
l = mid
} else {
r = mid - 1
}
}
return l
} func countZeros(value int) int {
zeros := 0
for value != 0 {
zeros += value / 5
value /= 5
}
return zeros
}

[LC793]阶乘函数后 K 个零的更多相关文章

  1. Java实现 LeetCode 793 阶乘函数后K个零 (分析)

    793. 阶乘函数后K个零 f(x) 是 x! 末尾是0的数量.(回想一下 x! = 1 * 2 * 3 * - * x,且0! = 1) 例如, f(3) = 0 ,因为3! = 6的末尾没有0:而 ...

  2. [Swift]LeetCode793. 阶乘函数后K个零 | Preimage Size of Factorial Zeroes Function

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

  3. Python爬虫学习(4): python中re模块中的向后引用以及零宽断言

    使用小括号的时候,还有很多特定用途的语法.下面列出了最常用的一些: 表4.常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>e ...

  4. python中的re模块中的向后引用和零宽断言

    1.后向引用 pattern = re.compile(r"(\w+)")#['hello', 'go', 'go', 'hello'] # pattern = re.compil ...

  5. (顺序表的应用5.4.3)POJ 1012(约瑟夫环问题——保证前k个出队元素为后k个元素)

    /* * POJ-1012.cpp * * Created on: 2013年10月31日 * Author: Administrator */ #include <iostream> # ...

  6. k3 cloud工程量清单调整后工程量为零行设置为黄色

    #引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee ...

  7. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  8. LeetCode刷题总结-二分查找和贪心法篇

    本文介绍LeetCode上有关二分查找和贪心法的算法题,推荐刷题总数为16道.具体考点归纳如下: 一.二分查找 1.数学问题 题号:29. 两数相除,难度中等 题号:668. 乘法表中第k小的数,难度 ...

  9. leetcode难题

    4 寻找两个有序数组的中位数       35.9% 困难     10 正则表达式匹配       24.6% 困难     23 合并K个排序链表       47.4% 困难     25 K ...

  10. C#LeetCode刷题-二分查找​​​​​​​

    二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

随机推荐

  1. Redis的发布订阅Pub/Sub

    发布订阅 Redis 发布订阅(publish/subscribe)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 ...

  2. Java统计list集合中重复的元素

    本题目能够从宏观上理解list.set.map三大集合的特点: 解决思路是:使用一个map,key用来记录list中的数据,我们知道set集合不允许元素重复,正好在map的jdk8的api中有一个ke ...

  3. 哈希(C语言)

    文章目录 1.数据结构--哈希表 1.1哈希表的工作原理 1.2哈希表的代码实现 2.哈希算法 2.1 哈希算法介绍 2.2C语言实现示例 本文介绍一个常用的算法--哈希算法,哈希算法依赖于哈希表来实 ...

  4. Nuxt.js 应用中的 components:extend 事件钩子详解

    title: Nuxt.js 应用中的 components:extend 事件钩子详解 date: 2024/11/1 updated: 2024/11/1 author: cmdragon exc ...

  5. 初识GO语言--基本规则

  6. 在美国和以色列的技术支持下BP机可以爆炸,那么苹果手机是否也可以被远程引爆

    要知道,这一切在技术上都是可以实现的. 由此可见,带电池的产品,最为稳妥的办法就是购买在中国组装的产品,否则其安全性是无法保证的.有人可能会说美国政府不会单独的通过这种方法去定向的杀害某个中国普通人, ...

  7. .NET斗鱼直播弹幕客户端(上)

    现在直播平台由于弹幕的存在,主播与观众可以更轻松地进行互动,非常受年轻群众的欢迎.斗鱼TV就是一款非常流行的直播平台,弹幕更是非常火爆.看到有不少主播接入弹幕语音播报器.弹幕点歌等模块,这都需要首先连 ...

  8. NOIP2023模拟9联测30 T3 高爸

    NOIP2023模拟9联测30 T3 高爸 三分啊,三分-- 思路 设现在的平均力量值为 \(x\),大于 \(x\) 力量值的龙有 \(n\) 条,小于等于的龙有 \(m\) 条,花费为: \[a( ...

  9. Lua 按指定字符切割字符串的方法gsub

    1. 利用string库的gsub函数 function split( str,reps ) local resultStrList = {} string.gsub(str,'[^'..reps.. ...

  10. js之模块导入与导出:export、export default、module.exports、exports

    前两者export.export default可为一组,是es6的规范,和import匹配,import是es6中的语法标准:后两者module.exports.exports可为一组,是commo ...