ZCMU—1375
来源:互联网 发布:windows ping包 编辑:程序博客网 时间:2024/06/11 05:52
1375: 阶乘的零
Time Limit: 1 Sec Memory Limit: 128 MB[Submit][Status][Web Board]
Description
定义f(n)为n!的末尾零的个数,例如f(4)=0,f(5)=1。你的任务是对于一个给定的的值x找出最小的n满足f(n)=x。
Input
多组测试数据,每组测试数据包含一个正整数x(1<=x<=10^8)。
Output
对于每组测试数据输出对应的n,若没有n满足则输出“No solution”。
Sample Input
2
Sample Output
10
HINT
water problem!
【分析】
首先...我们要会算n!有几个0,显然有几个0取决于n!这个数中因子2的个数和因子5的个数,显然2的个数远大于5,所以只要考虑因子5的个数就可以了~当然不能用n的算法...需要log5(n)的速度...
对N进行质因数分解 N=2^x * 3^y * 5^z...,由于10 = 2*5,所以末尾0的个数只和x与z有关,每一对2和5相乘可以得到一个10,于是末尾0的个数=min(x,z)。在实际中x是远远大于z的,所以我们只要求出z的值即可。
根据公式
z = N/5 + N/5^2 + N/5^3+...+N/5^k
根据公式
z = N/5 + N/5^2 + N/5^3+...+N/5^k
这表明,5的倍数贡献了一个5,5^2的倍数又贡献了一个5...
比如:25其实是贡献了2个5,但是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个;同样,125在N/5中贡献一个,在N/5^2中贡献一个,在N/5^3中再贡献一个,一共是3个。
比如:25其实是贡献了2个5,但是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个;同样,125在N/5中贡献一个,在N/5^2中贡献一个,在N/5^3中再贡献一个,一共是3个。
知道这点之后就容易了,这道题显然是有数学公式可以直接求答案的...但是因为我比较懒所以写了个二分直接查答案了...因为上面这个算n!末尾0个数的速度太快了,加上二分基本上也属于常数算法...所以....嗯直接搜吧!手动给一个极大的区间然后搜就好了
【代码】
#include <stdio.h>long long find(long long x){long long ans=0;while (x){ans+=x/5;x/=5;}return ans;}int main(){long long n;while (~scanf("%lld",&n)){long long left=5;long long right=1000000000000;while (left<right){long long mid=(left+right)/2;long long m=find(mid);if (m==n){while (mid%5) mid--;printf("%lld\n",mid);goto out;}if (m>n) right=mid-1;else left=mid+1;}printf("No solution\n");out:;}}
0 0
- ZCMU—1375
- ZCMU—1678
- ZCMU—1605
- ZCMU—1067
- ZCMU—1607
- ZCMU—1069
- ZCMU—1611
- ZCMU—1606
- ZCMU—1774
- ZCMU—1766
- ZCMU—1752
- ZCMU—1724
- ZCMU—1623
- ZCMU—1689
- ZCMU—1667
- ZCMU—1639
- ZCMU—1668
- ZCMU—1540
- 关于ShellShock漏洞的利用过程和原理解析
- 2017年科技行业顶尖项目展开(上)
- 每天一个 Linux 命令(20):find命令之exec
- HashMap和Hashtable的区别
- mfc100u.dll丢失的解决方法
- ZCMU—1375
- 读《代码大全》第2版 第13章 不常见的数据类 ~ 19章
- Label显示不同颜色、字体的文字
- 折叠文本的使用
- Android之ScrollView
- 对象图
- oracle删除archlog日志
- 取消TableView的headerView和footerView的悬停效果
- 厨房光线不好,做菜看不清,给厨房装了一个小灯