题干:
输入描述:
第一行:一个整数X
输出描述:
第一行:一个整数N
示例1
输入
7
输出
10
备注:
每个测试点所对应的X满足:
第i个测试点输入的值为第i-1个测试点输入的值乘以10再加上7。
特别的,第一个测试点所输入的值为7。
提示:数据共有10组。
解题报告:
可以斯特林公式打表(因为数据都已知了,7,17,177,1777.....可以Java大数打表),也可以直接二分。 这里提供两种二分方法。
AC代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const double pi = acos(-1), e = exp(1.0);
ll x;
double up;
bool check(double n){
return 0.5 * log(2 * pi * n) + n * log(n / e) >= up;
}
int main() {
scanf("%lld",&x);
up = x * log(x);
int times = 51;
double l = 1, r = 1e13, ans;
while(times--) {
ll mid = (l + r) / 2;
if(check(mid)) ans = mid, r = mid;
else l = mid;
}
cout <<(long long )ans;
return 0;
}
AC代码2:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
ll x;
cin>>x;
ll l=x,r=x*3,mid;
while (l<r) {
mid=(l+r)/2;
if (log(mid*1.0)*mid-mid+log(x)-1<x*log(x)) l=mid+1;
else r=mid;
}
cout<< l << endl;
return 0;
}