题干:
输入描述:
第一行:一个整数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;
}