cychester

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 }
View Code

 

 

posted on 2018-09-07 11:03  cychester  阅读(230)  评论(1编辑  收藏  举报

导航