当前位置: 首页 > article >正文

lanqiaoOJ 2145:求阶乘 ← 二分法

【题目来源】
https://www.lanqiao.cn/problems/2145/learning/

【题目描述】
满足 N!的末尾恰好有 K 个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 -1。

【输入格式】
一个整数 K。

【输出格式】
一个整数代表答案。

【输入样例】
2

【输出样例】
10

【评测用例规模与约定】
对于 30% 的数据,1≤K≤
10^6.
对于 100% 的数据,1≤K≤
10^18.

【算法分析】
● 二分法的
应用条件是“序列是单调有序的”,这题满足吗?因为 n 递增时,尾零的数量也是单调递增的,符合二分应用条件。

● 给定 n!,其 2*5 出现的次数,即是 n! 的末尾出现 0 的次数。而 n! 中,因子 2 出现的次数多,因子 5 出现的次数少,所以统计 2*5 出现的次数就转化为
统计 5 出现的次数

● 当数据比较大时,可能会产生溢出。所以,本题中使用
mid=le+(ri-le)/2 而不是 mid=(le+ri)/2。

【算法代码】

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

LL check(LL x) {
    LL ans=0;
    while(x>0) {
        ans+=x/5;
        x/=5;
    }
    return ans;
}

int main() {
    LL k;
    cin>>k;
    LL le=1, ri=1e19;
    while(le<ri) {
        LL mid=le+(ri-le)/2;
        if(check(mid)>=k) ri=mid;
        else le=mid+1;
    }
    LL x=check(ri);
    cout<<(x==k?ri:-1)<<endl;

    return 0;
}

/*
in:
2

out:
10
*/




【参考文献】
https://mp.weixin.qq.com/s/wV_bAQGg1TItv0Tk-FJiOg
https://blog.csdn.net/hnjzsyjyj/article/details/136764077
https://blog.csdn.net/hnjzsyjyj/article/details/136827860


 


http://www.kler.cn/a/525332.html

相关文章:

  • python3+TensorFlow 2.x(三)手写数字识别
  • Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)
  • C++并发编程指南02
  • 高级同步工具解析
  • 新年快乐!给大家带来了一份 python 烟花代码!
  • Openfga 授权模型搭建
  • 10.6.1 文本文件读、写和追加
  • Vue.js组件开发-使用Vue3如何实现上传word作为打印模版
  • webAPI -DOM 相关知识点总结(非常细)
  • 常用符号的英语表达
  • MATLAB提供的颜色映射表colormap——伪彩色
  • ES2021+新特性、常用函数
  • 【Qt】06-对话框
  • 人口增长(信息学奥赛一本通-1070)
  • sudoers文件修改格式错误恢复
  • 《机器学习数学基础》补充资料:贝叶斯分类器
  • R语言统计分析——ggplot2绘图3——分组
  • 18.Word:数据库培训课程❗【34】
  • 无心剑七绝《经纬岁华》
  • llama.cpp LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK2
  • Tailwind CSS - Tailwind CSS 引入(安装、初始化、配置、引入、构建、使用 Tailwind CSS)
  • DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力
  • 代码随想录算法训练营第34天| 动态规划:01背包理论基础(二维和一维)、416. 分割等和子集
  • 【实践案例】使用Dify构建企业知识库
  • 探索Linux中的进程控制:从启动到退出的背后原理
  • 使用 Iptables 实现网络安全策略:从入门到精通