牛客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;
}

猜你喜欢

转载自blog.csdn.net/xiang_hehe/article/details/82598116