[LC793]阶乘函数后 K 个零
题目描述
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
- 比如1!, 2!, 3!, 4!都满足最后的0的个数为小于等于0个,那么这个
- 那么本题的解可以转化为
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 个零的更多相关文章
- Java实现 LeetCode 793 阶乘函数后K个零 (分析)
793. 阶乘函数后K个零 f(x) 是 x! 末尾是0的数量.(回想一下 x! = 1 * 2 * 3 * - * x,且0! = 1) 例如, f(3) = 0 ,因为3! = 6的末尾没有0:而 ...
- [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 ...
- Python爬虫学习(4): python中re模块中的向后引用以及零宽断言
使用小括号的时候,还有很多特定用途的语法.下面列出了最常用的一些: 表4.常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>e ...
- python中的re模块中的向后引用和零宽断言
1.后向引用 pattern = re.compile(r"(\w+)")#['hello', 'go', 'go', 'hello'] # pattern = re.compil ...
- (顺序表的应用5.4.3)POJ 1012(约瑟夫环问题——保证前k个出队元素为后k个元素)
/* * POJ-1012.cpp * * Created on: 2013年10月31日 * Author: Administrator */ #include <iostream> # ...
- k3 cloud工程量清单调整后工程量为零行设置为黄色
#引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- LeetCode刷题总结-二分查找和贪心法篇
本文介绍LeetCode上有关二分查找和贪心法的算法题,推荐刷题总数为16道.具体考点归纳如下: 一.二分查找 1.数学问题 题号:29. 两数相除,难度中等 题号:668. 乘法表中第k小的数,难度 ...
- leetcode难题
4 寻找两个有序数组的中位数 35.9% 困难 10 正则表达式匹配 24.6% 困难 23 合并K个排序链表 47.4% 困难 25 K ...
- C#LeetCode刷题-二分查找
二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
随机推荐
- 专访|开源之夏最佳质量奖 Apache RocketMQ Committer 黄章衡
随着开源之夏2022年度优秀学生名单出炉,其中Apache RocketMQ Committer 黄章衡同学获得开源之夏最佳质量奖.今天,我们也带来黄章衡同学的人物专访. https://summer ...
- manim边学边做--极坐标平面
PolarPlane,顾名思义,是用于创建极坐标平面的类. 与笛卡尔坐标系不同,极坐标系是基于角度和半径来定位点的,这里的每个点由一个角度和距离原点的距离表示. 在Manim中,PolarPlane通 ...
- LeetCode题目练习记录 _栈、队列01 _20211012
LeetCode题目练习记录 _栈.队列01 _20211012 84. 柱状图中最大的矩形 难度困难1581 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . ...
- 使用 vscode 简单配置 ESP32 连接 Wi-Fi 每日定时发送 HTTP 和 HTTPS 请求
最新博客文章链接 文字更新时间:2024/11/07 由于学校校园网,如果长时间不重新登陆的话,网速会下降,所以想弄个能定时发送 HTTP 请求的东西.由于不想给路由器刷系统,也麻烦.就开始考虑使用局 ...
- 【python】利用tqdm实现git下载时的进度条效果
注意1:这里是在python3环境下使用的git,安装要使用 pip install Gitpython 来安装在python环境下的git 注意2:这个方法可适用于 windows 环境和 Linu ...
- Visual Studio 存在版本之间冲突
1 . 检查项目中有没有重复引用的包,如果有的话卸掉一个. 2.. 检查项目中引用的包是否自带所重复的包,这样会导致项目之间引发包冲突. 举个例子: 我的项目里ICSharpCode.SharpZip ...
- Air780E篇:采集温湿度传感器数据,并网页查看
今天我们学习合宙低功耗4G模组Air780E篇:采集温湿度传感器数据并实现网页查看,以下进入正文. 一.硬件装备 1.1 硬件连接 使用跳线帽将IO_SEL连接3.3V,给引脚供3.3V的电.dh ...
- 4G模组PSM+超低功耗,手把手教你!
合宙4G-Cat.1模组支持三种功耗模式: 常规模式 低功耗模式 PSM+模式 用户可以根据不同的应用场景,按需选择不同的合宙4G-Cat.1模组功耗模式,以及三种功耗模式之间的相互转换. 合宙 ...
- NOIP2023模拟9联测30 T4 金牌
NOIP2023模拟9联测30 T4 金牌 LCA 还能 \(O(1)\)-- 思路 思路非常简单,可考试就是想歪成统计指数了-- 将一条穿过 \((x,y)\) 的路径 \((u,v)\) 分为 \ ...
- TOML 1.0格式语法
github: https://github.com/BurntSushi/toml TOML 旨在成为一个语义显著而易于阅读的最低限度的配置文件格式.TOML 被设计地能够无歧义地转化为哈希表.TO ...