题干:

 

输入描述:

第一行:一个整数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;
}