D – 2-variable Function
题目描述:
给你一个n,问大于等于n的最小的x,满足
思路:
n最大是
1e18
,所以a
和b
都不会超过1e6
,再加上固定一个变量a后,是一个单调递增的函数,所以我们可以枚举 a
,再去二分找b
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define debug(a) cout << "Debuging...|" << #a << ": " << a << "\n";
typedef long long ll;
typedef pair <int,int> pii;
#define MAX 300000 + 50
ll n, m, k;
ll cal(ll a, ll b){
return a * a * a + a * a * b + a * b * b + b * b * b;
}
ll erfen(ll x){
ll l = 0ll, r = 1000000ll;
while (l <= r) {
ll mid = (l + r) / 2;
if(cal(x, mid) >= n)r = mid - 1;
else l = mid + 1;
}
return cal(x, l);
}
void work(){
cin >> n;
ll ans = 1e18;
for(ll l = 0; l <= 1000000ll; ++l){
ans = min(ans, erfen(l));
}
cout << ans << endl;
}
int main(){
io;
work();
return 0;
}