链接: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);
}