牛客OI赛制测试2 F假的数学游戏 - 斯特林公式+二分

链接:https://www.nowcoder.com/acm/contest/185/F
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

输入一个整数X,求一个整数N,使得N!恰好大于XX。

输入描述:

第一行:一个整数X

输出描述:

第一行:一个整数N

示例1

输入

复制

7

输出

复制

10

备注:

每个测试点所对应的X满足:

第i个测试点输入的值为第i-1个测试点输入的值乘以10再加上7。

特别的,第一个测试点所输入的值为7。

提示:数据共有10组。

思路:

斯特林公式:

n!约等于sqrt(2πn)(n/e)^n

然后因为数分大,用二分的方法求解

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<string>
#include<cstring>
using namespace std;
#define ll long long
const ll INF=1e+12,PI=acos(-1);
int main(){
    ll n;
    scanf("%lld",&n);
    double q=n*log(n);
    ll left=0,right=INF;
    while(left+1<right){
        ll mid=(left+right)>>1;
        if(log(sqrt(2*PI*mid))+mid*(log(mid)-1)>q){
            right=mid;
        }
        else left=mid;
    }
    printf("%lld\n",right);
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/82596111