1. 程式人生 > >牛客oi賽制測試賽F——假的數學遊戲【數論,二分】

牛客oi賽制測試賽F——假的數學遊戲【數論,二分】

連結:https://www.nowcoder.com/acm/contest/185/F
來源:牛客網
 

輸入一個整數X,求一個整數N,使得N!恰好大於XX。

 

輸入描述:

第一行:一個整數X

輸出描述:

第一行:一個整數N

示例1

輸入

複製

7

輸出

複製

10

備註:

每個測試點所對應的X滿足:

第i個測試點輸入的值為第i-1個測試點輸入的值乘以10再加上7。

特別的,第一個測試點所輸入的值為7。

提示:資料共有10組。

這道題考察斯特林公式的應用,關於斯特林公式我們可以參考一下這篇部落格斯特林公式,然後我們為了繼續縮小搜尋範圍我們可以對方程兩邊同時log一下,最好以e為底,之前一直以10為底樣例總是過90%,然後我們設定好上界和下界,通過不斷縮小上界找出最小值。

#include <bits/stdc++.h>
 
using namespace std;
#define pi acos(-1.0)
#define e exp(1)
int main(){
    long long x;
    while(~scanf("%lld",&x)){
        long long left = 1, right = 1e12;
        long long minn = 1;
        double ans = log10(x)*x;
        while(left <= right){
            long long mid = (left + right) / 2;
            if(log10(sqrt(2*pi*mid)) + mid*log10(mid/e) > ans){
                minn = mid;
                right = mid - 1;
            }
            else left = mid + 1;
        }
        printf("%d\n",minn);
    }
    return 0;
}