2013寒假练习 1046 Leftmost Digit
2013-02-16 18:44
260 查看
地址:http://acm.bit.edu.cn/mod/programming/view.php?a=532
题意:(1 <= n<= 10^7),问n!的最高位数字。
hdu有一道同名题目是问n^n的最高位数字,较为基础,原理一致。设n^n=a*10^b(科学计数法)其中a的整数部分即为所求然后化为nlog(n)=loga+b进一步的loga即为nlogn的小数部分,然后就能求出a,最终求出a的整数部分。对于本题方法基本一致,但左边变成了log(n!).若用log(n)+log(n-1)+...+log1,会TLE,于是对于较大的n用斯特林公式近似。参考伟神日志/article/10284845.html(拜)。
题意:(1 <= n<= 10^7),问n!的最高位数字。
hdu有一道同名题目是问n^n的最高位数字,较为基础,原理一致。设n^n=a*10^b(科学计数法)其中a的整数部分即为所求然后化为nlog(n)=loga+b进一步的loga即为nlogn的小数部分,然后就能求出a,最终求出a的整数部分。对于本题方法基本一致,但左边变成了log(n!).若用log(n)+log(n-1)+...+log1,会TLE,于是对于较大的n用斯特林公式近似。参考伟神日志/article/10284845.html(拜)。
#include<iostream> #include<cmath> #define PI acos(-1.0) #define e 2.71828182845904523536028744 int main() //log(n!)=b+log(a),log(a)为log(n!)的小数部分 { int n,t; double logn,loga,a; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n<1000) { logn=0; for(int i=1;i<=n;i++) logn+=log10((double)i); } else logn=log10(sqrt(2*PI*n))+n*log10(n/e);//斯特林公式 loga=logn-floor(logn); a=pow(10.0,loga); printf("%d\n",(int)floor(a)); } return 0; }
相关文章推荐
- 2013寒假练习 1052 青蛙的约会
- 2013寒假练习 1003: Exchange for Cola(2/13更新)
- 2013寒假练习 1008:Putting Apples
- 2013寒假练习 1021:Pascal's Travels
- 2013寒假练习 1026 Til the Cows Come Home
- BIT寒假练习-2013__1009:Number Sequence
- 2013寒假练习 1006:The most frequent number
- BIT寒假练习-2013__1010:Maximum Sum
- 2013寒假练习 1002: Roman numerals
- 2013寒假练习 1012:导弹防御问题
- 2013寒假练习 1016:滑雪
- 2013寒假练习 1015:Edit Distance
- 2013寒假练习 1057 SUM
- 2013寒假练习 快速幂三弹连发 A^B mod C v1.0-3.0
- BIT寒假练习-2013__1012:导弹防御问题
- 2013寒假练习 1007:Number Converter
- 2013寒假练习 1047 Fibonacci Numbers
- 2013寒假练习 1035 远古石碑
- BIT寒假练习-2013__1000:a+b
- 2013寒假练习 1050 Diophantus of Alexandria