题干:

输入描述:
第一行:一个整数X输出描述:
第一行:一个整数N
示例1
输入
复制
7输出
复制
10备注:
每个测试点所对应的X满足:
第i个测试点输入的值为第i-1个测试点输入的值乘以10再加上7。
特别的,第一个测试点所输入的值为7。
提示:数据共有10组。解题报告:
可以斯特林公式打表(因为数据都已知了,7,17,177,1777.....可以Java大数打表),也可以直接二分。 这里提供两种二分方法。

AC代码:
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:
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;
}
                





