51nod1058
這題讓求n的階乘長度,n範圍到1e6,很明顯會爆long long,那麼就需要一個公式直接算出結果–斯特林公式,這個公式的作用就是求n階乘的近似值。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMxYzN4YGZiNDZwUWNxIjNzYzXyUTMwUTMyAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
我們知道求一個十進制數x的位數,log10(x) + 1,
用斯特林公式帶入x,兩邊取對數
可以看出斯特林公式的作用,上式左邊n!會爆,而右邊的每一項都不會爆long long,因為取了對數。這樣就可以算出位數了。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define d(x) cout << (x) << endl
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
const double PI = 3.1415926;
int n;
int main()
{
scanf("%d", &n);
int pos = int((0.5 * log(2 * PI * n) + n * (log(n) - 1)) / log(10));
printf("%d\n", pos + 1);
return 0;
}