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

蓝桥杯2022年第十三届省赛真题-求阶乘

题目:满足 N! 的末尾恰好有 K 个 0 的最小的 N 是多少?

如果这样的 N 不存在输出 −1。

对于 30% 的数据,1 ≤ K ≤ 10^6 .

对于 100% 的数据,1 ≤ K ≤10^18 .

思路:可以看到数据范围很大,如果求阶乘枚举,是不可能的。

0是由2*5才能出现,所以寻找因子2和5,又由于因子2的频率远远大于5的频率,因此寻找因子5的频率

如寻找k=2时,那么n=10;因为10的阶乘中5的因子有两个分别是10和5

如果之间输出25不行吗?答案是不行,k5一定行,但不保证是最小的,如当k=6时,为30的阶乘后面一定有6个0,但不是最小的,其中25的阶乘也可以,因为25=5*5提供了两个5因子。

所以进行二分查找范围1-k*5;

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

typedef long long ll;
ll k;
ll ans=-1;
ll check(ll n)
{
	//因子5的个数 
	ll cnt=0;
	while(n)
	{
		cnt+=n/5;
		n=n/5;
	}
	return cnt;
}
int main(void)
{
	cin>>k;
	ll l=1;
	ll r=5*k+2;
	
	while(l<=r)
	{
		ll mid=(r+l)/2;
		if(check(mid)>=k)
		{
			r=mid-1;
			if(check(mid)==k)
			ans=mid;
		}
		else l=mid+1;
	}
	cout<<ans;
	return 0;
}

相关文章:

  • Web Worker
  • 2024年KBS SCI1区TOP:信息增益比子特征分组赋能粒子群算法ISPSO,深度解析+性能实测
  • MySQL InnoDB设计图鉴——核心组件讲解
  • Elasticsearch-新增数据时自动生成 @timestamp 时间字段
  • 使用 3D Layout 和 Icepak 进行 PCB、DCIR 和热分析
  • 如何预估一个系统的QPS
  • TIM输出比较--PWM
  • Android性能案例分析
  • Spring Cloud 通用相关组件详解
  • 详解 kotlin 相对 Java 特有的关键字及使用
  • 《算法笔记》3.1小节——入门模拟->简单模拟
  • C#: DxF文件中Spline解析
  • 【前缀和】矩阵区域和(medium)
  • 支付系统设计入门:核心账户体系架构
  • C++ 入门三:函数与模板
  • windows主机中构建适用于K8S Operator开发环境
  • 【软考-高级】【信息系统项目管理师】【论文基础】进度管理过程输入输出及工具技术的使用方法
  • 编程语言中变量定义方式的深度剖析
  • 简化DB操作:Golang 通用仓库模式
  • 【家政平台开发(33)】库存管理模块开发实战:从基础搭建到智能管控