大意就是求 :
log10(n!) = log10(1 * 2 * 3 * .......*n) = log10(1) + log10(2) + ........+log10(n);
打表的话会MLE,直接递推就行了,后台数据不会很刁钻。
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 10000000; //double dp[maxn + 1]; //void List(){ // dp[1] = log10(1.0); // for(int i = 2; i < maxn; i++) // dp[i] = dp[i - 1] + log10(1.0 * i); // return; //} int main(){ int T; //List(); scanf("%d",&T); while(T--){ int n; scanf("%d",&n); double ret = 0; for(int i = 1; i <= n; i++) ret += log10(1.0 * i); printf("%.f\n",ceil(ret)); } return 0; }
还有一种方法,就是斯特林公式
也就是log10(n!) = log(n!) / log(10) = ( n*log(n) - n + 0.5*log(2*π*n))/log(n);
直接公式就出来了,更快捷。
这里就不多说了。
时间: 2024-10-14 12:51:38