zoukankan      html  css  js  c++  java
  • 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
    ", ans);
    31 }
    View Code

     

  • 相关阅读:
    阅读文献总结笔记11
    阅读文献总结笔记20
    阅读文献总结笔记13
    阅读文献总结笔记19
    阅读文献总结笔记17
    阅读文献总结笔记18
    阅读文献总结笔记15
    java图片以字符串的形式传输
    java与C#对接签名和验签
    SIP代码大全
  • 原文地址:https://www.cnblogs.com/cychester/p/9603344.html
Copyright © 2011-2022 走看看