摘要: Last non-zero Digit in N!该题数据较大,n可能有数百位,直接计算n!或通过n次计算都必然会超时。关键在于找出数字的规律。对于n<10,直接枚举即可,下面考虑n>=10的情况。n!的尾部的0都来自因子5和因子2(一对5&2产生一个0),如果把这些因子去掉,则可符合要求。定义F(n)为所要求的数,G(n)为1,2…n中将5的倍数的数换成1后的各项乘积(如:G(15)=1*2*3*4*1*6*7*8*9*1*11*12*13*14*1)(G(n)%10必不为0)。则n!=(n/5)!*5^(n/5)*G(n),F(n)=F(n/5)*[5^(n/5)*G( 阅读全文
posted @ 2012-04-18 22:32 LETTers 阅读(421) 评论(0) 推荐(0) 编辑
摘要: N!的最高位该题如果直接用上述方法必然会超时,因为只要最高位,精确的方法可以是x=(int)(10^( log10(N!)-(int)log10(N!))),但由于n可能很大,这样都会超时,这里用到一个公式,Stirling公式,在n较小时直接给出,在较大时用Sterling公式算出n!近似值,再求的最高位。#include<iostream>#include<math.h>using namespace std;const double PI = 3.14159265358979323846;const double E = 2.7182818284590452353 阅读全文
posted @ 2012-04-18 22:23 LETTers 阅读(242) 评论(0) 推荐(0) 编辑
摘要: N!log10(10000!) = ∑log10(i)( 1<= i <= 10000) = 35659.5,所以10000!≈10^35659.5,这个数很大,所以用模拟手算乘法的方法计算。#include<iostream>#include<math.h>using namespace std;#define MAXN 40000int a[MAXN], bit;void mul(int*m, int a) // m = m * a{ int c, i; bit += int(log10(double(a))) + 2; for(c=0,i=0; i&l 阅读全文
posted @ 2012-04-18 21:33 LETTers 阅读(137) 评论(0) 推荐(0) 编辑