洛谷 P2388 阶乘之乘 题解
博客园同步
原题链接
简要题意:
求 ∏ i = 1 n ∏ j = 1 i j \prod_{i=1}^n \prod_{j=1}^i j ∏i=1n∏j=1ij 的末尾有几个零。
显然,我们对原式进行修改:
∏ i = 1 n ∏ j = 1 i j \prod_{i=1}^n \prod_{j=1}^i j i=1∏nj=1∏ij
= ∏ j = 1 n j ⋅ ( n − j + 1 ) =\prod_{j=1}^n j \cdot (n-j+1) =j=1∏nj⋅(n−j+1)
这是因为每个数 j j j 在所有 ≥ j \geq j ≥j 的阶乘中都被乘了一遍。
下面我们只需要考虑:
末尾零是如何产生的?—— 2 × 5 = 10 2 \times 5 = 10 2×5=10.即每一个 2 2 2 和 5 5 5 这一组就会给答案产生 1 1 1 的贡献。
那么, 5 5 5 的个数和 2 2 2 的个数哪个多呢?
显然, 2 2 2 的个数 不小于 5 5 5 的个数, 这是因为,你只需比较这两个式子:
∑ j = 1 ∞ ⌊ n 5 j ⌋ \sum_{j=1}^{\infty} \lfloor{ \frac{n}{5^j} \rfloor} j=1∑∞⌊5jn⌋
∑ j = 1 ∞ ⌊ n 2 j ⌋ \sum_{j=1}^{\infty} \lfloor{ \frac{n}{2^j} \rfloor} j=1∑∞⌊2jn⌋
分子相同,当然分母小的大喽!
所以我们只需要计算 5 5 5 的个数。
下面我们定义:
F n = ∑ j = 1 ∞ ⌊ n 5 j ⌋ F_n = \sum_{j=1}^{\infty} \lfloor{ \frac{n}{5^j} \rfloor} Fn=j=1∑∞⌊5jn⌋
也就是 n n n 有的 5 5 5 的个数。
那么对于每个 5 × i 5 \times i 5×i 即 5 5 5 的倍数,它们会对答案产生的贡献是:
F 5 × i ⋅ ( n + 1 − 5 × i ) F_{5 \times i} \cdot (n+1-5 \times i) F5×i⋅(n+1−5×i)
这是因为,我们上面的那个变形。还记得吗?
∏ i = 1 n ∏ j = 1 i j \prod_{i=1}^n \prod_{j=1}^i j i=1∏nj=1∏ij
= ∏ j = 1 n j ⋅ ( n − j + 1 ) =\prod_{j=1}^n j \cdot (n-j+1) =j=1∏nj⋅(n−j+1)
只需要算单点的贡献即可。
时间复杂度为: O ( n 5 log 5 n ) = O ( n log n ) O(\frac{n}{5} {\log}_5 n) = O(n \log n) O(5nlog5n)=O(nlogn)
如果你觉得是 O ( n log n ) O(n \log n) O(nlogn) 会妥妥的超时,那你错了。
在不忽略任何常数的情况下:
O ( 1 0 8 5 log 5 1 0 8 ) = 12 × ( 2 × 1 0 7 ) = 2.4 × 1 0 8 O(\frac{10^8}{5} {\log}_5 10^8) = 12 \times (2 \times 10^7) = 2.4 \times 10^8 O(5108log5108)=12×(2×107)=2.4×108
你可能觉得这个时间复杂度还是有点危险?
确实,这里有 log 5 n {\log}_5 n log5n 的更优算法,但这里不再提及。
这可能是因为洛谷的评测机比较快吧……
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;typedef long long ll;inline ll read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}ll x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}ll n,ans=0;inline int five(ll n) { //计算5的个数int s=0;while(n%5==0)s++,n/=5;return s;
}int main(){n=read();for(int i=1;i<=n/5;i++) {ans+=five(5*i)*(n+1-5*i);} printf("%lld\n",ans);return 0;
}
洛谷 P2388 阶乘之乘 题解相关推荐
- 洛谷P1129 [ZJOI2007] 矩阵游戏 题解
洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...
- 洛谷P3336 [ZJOI2013]话旧 题解
洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...
- 洛谷P4683 [IOI2008] Type Printer 题解
洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...
- 洛谷P3647 [APIO2014] 连珠线 题解
洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...
- 洛谷P4170 [CQOI2007]涂色 题解
洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...
- 洛谷P1868 饥饿的奶牛 题解
洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...
- 洛谷P1462 通往奥格瑞玛的道路 题解
洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...
- 洛谷 P2015 二叉苹果树 题解
洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...
- 洛谷P3879 [TJOI2010] 阅读理解 题解
洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...
最新文章
- UTRAN 的用户面和控制面
- 微型计算机2013年10月下,微型计算机及接口技术2013年10月真题试题(04732)
- cuda 安装_win10+VS 2017 安装 CUDA(Visual Studio Integration失败)
- python class 是否存在某个变量_Python编程思想(29):使用type()函数定义类
- 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( “Python“ 因为出现问题而无法打开 )
- 1024分辨率章子怡/郭富城《最爱》HD国语中字
- php sql漏洞修复,php sql注入漏洞与修复
- Redis概述、数据类型
- 信息学奥赛一本通 1095:数1的个数 | OpenJudge NOI 1.5 40
- 10倍,BoostKit鲲鹏全局缓存3大创新技术助力Ceph性能提升
- 二维数组最大值首尾相连
- kali linux无法启动服务,不好了!出问题了!在安装Kali Linux之后启动系统时
- [其他] 10种技巧可提升Android应用运行效果
- python排序算法——冒泡排序时间复杂度
- 数据仓库与数据挖掘课后思考题整理
- PDF文件怎么转换成Word文档
- 绝对最大额定值(ABSOLUTE MAXIMUM RATINGS: ABS)是否可以超过
- 飞腾D2000 偶尔识别不到网卡
- 众盟超级推的“私域营销”,如何实现人人优活的流量十倍增?
- 掘金15W沸点简单分析(二)
热门文章
- 东北大学计算机面试有英语吗,2021年度考东北大学计算机研英语口语面试整理精华.doc...
- 神舟战神笔记本插入耳机后声音一只大一只小
- C++计算矩阵的最大最小值MaxMin和最小最大值MinMax。
- 第二章 第4节——块元素
- WinForm:模态窗口与非模态窗口、Close与Dispose
- 单片机-继电器-电磁阀
- fastboot命令驱动修改(uboot-imx/drivers/fastboot/fastboot.c)
- Linux ls 只显示目录的方法
- 月薪12K北漂程序员的真实生活!
- uniCloud中云函数、云对象、Schema表、openDB、JQL概述