JDOJ 1775: 求N!中0的个数

JDOJ传送门

Description

求N!结果中末尾0的个数

N! = 1 * 2 * 3 ....... N

Input

输入一行,N(0 < N < unsigned INT_MAX)

Output

输出一行,0的个数

Sample Input

5

Sample Output

1

题解:

求\(\prod_{i=1}^{i=n}\)中末尾0的个数,其实就是在求中\(\prod_{i=1}^{i=n}\)能被几个10整除。

因为\(\prod_{i=1}^{i=n}\)是连乘,所以想要乘出来一个10,那么当且仅当一个2和一个5相乘。

我们随便脑补一下,都会发现,\(\prod_{i=1}^{i=n}\)中出现2的几率一定比出现5的几率大得多,也就是说,如果\(\prod_{i=1}^{i=n}\)中有\(n\)个2,\(m\)个5,那么不一定有\(n\)个10,但一定会有\(m\)个10.

所以原题就变成了求\(\prod_{i=1}^{i=n}\)中能拆分出几个5。

得出第一份代码:

#include<cstdio>
#define ll long long
using namespace std;
ll n,ans;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
int j=i;
while(j%5==0)
{
ans++;
j/=5;
}
}
printf("%lld",ans);
return 0;
}

正确性可以保证,但是会TLE。

原因是这道题的数据很大。如果这样从1跑到\(N\),再一个个拆分,就一定会爆时间。那么我们开始往优化算法的方面去想。我们发现,一次跑1个5总不会有1次跑很多个5省事。没错,优化暴力枚举的大多数方法都是在原暴力的基础上合并可以一次筛选出来的东西,一次性加一起。

基于这个思想,我们发现,一个数中能拆出多少个5,其实就是能否拆出一个\(5^n\),所以我们只需要枚举判断能否拆出\(5^n\)即可。这样的运行效率会快非常多。

代码:

#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll n,ans,temp;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
if(n/pow(5,i)==0)
break;
temp=n/pow(5,i);
ans+=temp;
}
printf("%lld",ans);
return 0;
}

JDOJ 1775: 求N!中0的个数的更多相关文章

  1. 51nod_1003 阶乘后面0的数量(求N!中5的个数,数论)

    题意: n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0.   Input 一个数N(1 <= N <= 10^9) OutPut 输出0的数 ...

  2. Acdream1084 寒假安排 求n!中v因子个数

    题目链接:pid=1084">点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 ...

  3. Algorithm --> 求阶乘末尾0的个数

    求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...

  4. 求bit中1的个数有几种做法

    原文 求bit中1的个数有几种做法: - x & (x - 1) - Hamming weight的经典求法,基于树状累加:http://en.wikipedia.org/wiki/Hammi ...

  5. 求n!末尾0的个数

    题目连接 /* £:离散数学. £:n!中2的个数>5的个数. £:2*5=10: */ #include<cstdio> #include<cstring> #incl ...

  6. 172. Factorial Trailing Zeroes(阶乘中0的个数 数学题)

    Given an integer n, return the number of trailing zeroes in n!. Example 1: Input: 3 Output: 0 Explan ...

  7. 2018年东北农业大学春季校赛 E-wyh的阶乘(求n!的0的个数)

    链接:https://www.nowcoder.com/acm/contest/93/E来源:牛客网 题目描述 这个问题很简单,就是问你n的阶乘末尾有几个0? 输入描述: 输入第一行一个整数T(1&l ...

  8. SPOJ - DISUBSTR 求串中子串的个数

    \(height\)简单应用 #include<iostream> #include<cstdio> #include<cstring> #include<c ...

  9. POJ 1236--Network of Schools【scc缩点构图 &amp;&amp; 求scc入度为0的个数 &amp;&amp; 求最少加几条边使图变成强联通】

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13325   Accepted: 53 ...

随机推荐

  1. 【PL/SQL】设置F8自动运行

  2. 线上问题排查利器Arthas

    官方文档 下载arthas-boot.jar,然后用java -jar的方式启动: curl -O https://alibaba.github.io/arthas/arthas-boot.jar j ...

  3. MySQL实战45讲学习笔记:第三十八讲

    一.本节内容 我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0 这个值在最后一行:而使用磁盘临时表得到的结果里 ...

  4. (十八)golang--defer关键字

    在函数中,程序员经常需要创建资源(比如,数据库连接,文件句柄,锁等),为了在函数执行完毕后,及时释放资源,go设计者提供defer(延时机制) 用defer申明的语句不会立即执行,而是被存入到defe ...

  5. C++ 静态库与动态库以及在 Windows上 的创建、使用

    一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...

  6. Start LaTex

    目录 Size Color Shape Common Function Type Fill Label Beamer Example Size You can use: ultra thin , ve ...

  7. 【Linux命令】Linux命令后面所接选项和参数的区别

    Linux命令后面所接选项和参数的区别 在使用Linux命令时,有时候后面会跟一些"选项"(options)或"参数"(agruments) 命令格式为: #中 ...

  8. mybatis批量更新出现he error occurred while setting parameters

    当你更新一条时,不会发生问题,但是执行多条就出现了错误原因是mysql 配置jdbc:driver 应该添加&allowMultiQueries=trueurl:jdbc:mysql://lo ...

  9. Rust从入门到放弃(1)—— hello,world

    安装及环境配置 特点:安全,性能,并发 rust源配置 RLS安装 cargo rust管理工具,该工具可以愉快方便的管理rust工程 #!/bin/bash mkdir learn cd learn ...

  10. MySQL for OPS 03:索引和执行计划

    写在前面的话 啥是索引?以一本书为例,如果想要找到某一指定章节的某一小节,书薄还好,如果书厚,可能就会找的头皮发麻.于是便出现了目录,让用户更容易查找到自己所需要的东西.索引就类似一张表的目录.其存在 ...