Nowcoder OI赛制测试2 F 假的数学题 - 斯特林公式 + 二分
Description
给定$X$, 找到最小的$N$ 使得$N! > X^X$
数据范围: $x <= 1e11$
Solution
$X^X$ 太大, 高精也存不过, 所以取对数 : $lg(X^X)$ = Xlg(X),即要求出最小$N$的使得$lg(N!) > Xlg(X)$
N!有单调性, 可以使用二分答案来求出N, 但是每次$check$的复杂度是$O(N)$, 我们必须要进行优化。
通过斯特林公式 : , 取对数后: (图片都是转发的QuQ)
就可以在$O(1)$时间内算出$lg(N!)$ 并check。 总复杂度$O(logN)$
Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #define lb long double 6 #define ll long long 7 #define e 2.7182818284590453254 8 using namespace std; 9 10 lb n, x; 11 12 bool check(ll o) { 13 lb pi = acos(-1); 14 n = o; 15 n = log(2 * pi * n) / 2 + n * log(n / e); 16 if(n > x) return 1; 17 else return 0; 18 } 19 20 int main() 21 { 22 scanf("%llf", &x); 23 x = x * log(x); 24 ll l = 0, r = 1e18, ans = 0; 25 while(l <= r) { 26 ll mid = (l + r) >> 1; 27 if(check(mid)) ans = mid, r = mid - 1; 28 else l = mid + 1; 29 } 30 printf("%lld\n", ans); 31 }