hdu 1018
来源:互联网 发布:博达软件 编辑:程序博客网 时间:2024/06/04 19:31
hdu 1018
http://acm.hdu.edu.cn/showproblem.php?pid=1018
求N的阶乘的位数,1<=N<=10^7
解题方法:
针对每个非负整数n,计算其n!的位数,由于n的位数很大,我们不可能通过直接计算得到结果
1.设a=log10(n!) ,则n!=10^a,其中a是一个小数
2.设a=x+y,其中 x为整数,y为小数
3.因此 n!=10^x+10^y
4.10^x肯定为10的倍数,决定了n!的位数,10^y为(1~10,不取10),决定n!的各位数字
5.因此,只要知道了a就可以求出n!的位数
6.因为a= log10(n!)=log10(n)+ log10(n-1)+……log10(2)+log10(1),所以a的值可以很容易求出
另解:求N的阶乘的为数其结果相当于求小于N的最大素数,因此可以用求素数或素数筛法的方法求(不超时的情况下),当然也能用斯特林公式,可以当做斯特林公式的另一种应用了吧【其实是当时题目理解错误,还以为自己发现了什么不得了的东西哈哈】
相关知识:
斯特林公式简介:斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。
表达式: n!≈√(2πn)·(n/e)^n
利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );
当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
#include<iostream>#include<cmath>using namespace std;int main(){ int n,test,i,ans; double t; cin>>test; while(test--) { cin>>n; t=0; for(i=2;i<=n;i++) t+=log10(i*1.0); ans=int(t)+1; cout<<ans<<endl; } return 0;}
- hdu 1018
- hdu 1018
- HDU 1018
- hdu 1018
- hdu 1018
- hdu-1018
- hdu 1018
- HDU 1018
- HDU 1018
- hdu 1018
- HDU-1018
- HDU-1018
- hdu 1018
- hdu 1018
- hdu 1018
- HDU 1018
- hdu 1018
- hdu 1018
- Java编辑pdf
- oracle数据库用户管理操作(DCL)
- CodeForces
- 常见的简单笔试题却又要小心的题
- Unity2D游戏入门教程(一)宝石迷阵(1)创建项目
- hdu 1018
- 打印当前时间。
- 【C#】身份证识别(三):身份证信息识别
- yolo_v2训练自己的数据出现Obj: 0.000000, No Obj: 0.000000
- 通过ansible批量设置随机密码
- vmware linux和windows共享文件失效问题解决
- Code Festival 2017 qualA E-Modern Painting
- inno setup打包service
- HDU-5971 Wrestling Match (2016ACM/ICPC亚洲区大连站)