求N!尾数有多少个0。
方法一:假设N!=K*10M,K不能被10整除,那么N!尾数就有M个0。再对N!进行质因子分解:N!=2x*3y*5z...由于10=2*5,即每一对2和5相乘都可以得到1个0,所以M只与指数x、z有关,并且M=min(x,z)(x,z分别为N!的中因子2,因子5的个数)。因为N!中每两个数字就有一个数为2的倍数,即每5个数中(最后一个数为5的倍数)至少有2个数为2的倍数,而只有最后一个数为5的倍数,所以可知因子为2的个数一定不小于因子为5的个数(x>=z),即M=z。因此,我们只需统计N!中因子为5的个数即可!时间复杂度为O(nlog5n),其中n=N/5。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,cnt,tmp;
while(cin>>n){
cnt=;
for(int i=;i<=n;i+=){//n!内i只有为5的倍数才可产生因子5
tmp=i;
while(tmp%==)cnt++,tmp/=;//累加因子5的个数
}
cout<<cnt<<endl;
}
return ;
}
方法二:如果N是109呢,用方法一肯定会超时。此时有一条公式可以快速地求出N!尾数为0的个数:M=[N/5]+[N/52]+[N/53]+...公式的意思就是不大于N且为5的倍数的每个数各贡献一个因子5加上不大于N且为52的倍数的每个数各贡献一个因子5加上...,将所有结果累加即为N!中因子5的个数。时间复杂度为O(log5N)。举个例子:当N=25时,N!内为5的倍数的数有5,10,15,20,25,对应数字包含因子为5的个数为1,1,1,1,2,(很明显通过法一可知25!尾数有6个0)套一下法二的公式:N内为5的倍数的个数有N/5=25/5=5个,即前面5个数各贡献一个因子5,继续累加:N/52=25/25=1个,即最后一个数25也贡献一个因子5,所以25!尾数有6个0,因此验证了法二的正确性。其实这里用到了一个数论知识:若p是质数,p<=n,则N!是p的倍数,设px为p在N!内的最高次幂,则x=[N/p]+[N/p2]+[N/p3]+...,并且有[N/(p*p)]=[[N/p]/p]。结合法一可知p=5,即只需求N!内因子为5的个数!
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,cnt;
while(cin>>n){
cnt=;
while(n>4)cnt+=n/,n/=;
cout<<cnt<<endl;
}
return ;
}
最新文章
- 读取xml数据装配到字典中之应用场景
- emacs不能使用中文输入法
- js:数据结构笔记10--图和图算法
- hdwiki 的模板和标签
- Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建
- MAC 下cocos2d-x lua 使用dragonbones的方法
- Windows+Atlassian-Jira-6.0.4+MySql5.0安装破解汉化
- JAVA中的Buffer
- Java框架之Hibernate(三)
- vue环境搭建与创建第一个vuejs文件
- 两个ArrayList之间求交并补
- 计算概论(A)/基础编程练习(数据成分)/3:整数的个数
- Java从命令行接受多个数字并求和
- win7下python2.6如何安装setuptools和pip
- day20 python sys os time json pickl 正则
- mpu6050 DMP库的移植
- android studio 3.0.1使用笔记(二)
- Backup and restore of FAST Search for SharePoint 2010
- 不一样的入门:看C# Hello World的17种写法
- 51nod 1190 最小公倍数之和 V2
热门文章
- Promise编程规范
- ln 软连接 &; 硬连接
- Deepin-安装QQ音乐(Windows程序)
- 【机器学习具体解释】SVM解二分类,多分类,及后验概率输出
- android 多进程 Binder AIDL Service
- 积跬步,聚小流------ps有用小技巧,改变png图标颜色
- 浅谈asp.net通过本机cookie仿百度(google)实现搜索input框自己主动弹出搜索提示
- 2016/05/06 Sublime Text 3 常用插件以及安装方法(转)
- Datatables 1.10.x在命名上与1.9.x
- IsNumeric 判断字符串是否为数字(使用Val函数实现),这个函数相当于Java的IsNaN函数