题型:数论
题意:求n!的位数
分析:
首先需要了解一个知识点,就是如何计算一个数的位数。
可以来推导一下:
设有一个数a,10^(x-1) <= a < 10^x;
那么显然a的位数是x-1。
由上述不等式得 --> x-1 <= log10(a) <x;
--> x = (int)log10(a)+1;
这样一来,本题就可以有个思路了。
ans = (int)log10(n!)+1
= (int)log10(1*2*……*n)+1
= (int)(log10(1)+log10(2)+……+log10(n))+1
但是题目n的范围为10^7,而且是多组数据,所以,如果预处理存起来会MLE,每次都算一遍会TLE,需要考虑时间与空间的平衡。
O_o那怎么办呢。。。
还有更好的办法,利用斯特林公式即可一步到位。
所谓斯特林公式,求得是n!的近似解。
所以
ans = (int)log10(n!)+1
= (int)log10(sqrt(2*PI*n)*(n/e)^n)+1
= (int)(log10(sqrt(2*PI*n))+n*log10(n/e)+1)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<deque>
#define e exp(1.0)
#define PI acos(-1.0)
using namespace std;
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",(int)(log10(sqrt(2*PI*n))+n*log10(n*1.0/e))+1);
}
return 0;
}