题目描述

有不等式y⋅x3≤ n,已知y为正整数,x为大于1的正整数,问当x和y的解数量刚好为m的时候n的最小值,如果不存在输出 -1。

输入描述:

多组数据读入。
每组数据一个数字m,如题所示。

输出描述:

每组数据输出一行,输出答案。

题解

这题的m范围很大,如果直接枚举的话T到家..
我们仔细思考一下,这道题答案如果大于等于正解的话,解的方案数目将会大于等于m,若小于正解的话,那么方案数就会小于m,很显然,满足答案单调性,所以我们可以开开心心的写一个二分啦~
那我们要怎么去判定答案呢?很显然,肯定要比增长的要快,所以我们枚举,用我们二分的n去除以,就可以得到此时的方案个数,这样,判定也很愉快地搞定啦~
最后有一点要注意的是,我们最后二分出来的答案是方案数大于等于m的最小n,但这个n并不一定能够保证能让方案数恰好等于m,所以需要我们进行一下判断,这样,这道题就愉快的做完啦~

完整代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,ans;
bool check(ll x){
    ll sum=0;
    for(ll i=2;i*i*i<=x;++i){
        sum+=x/(i*i*i);
    }
    if(sum==n)ans=x;
    return sum>=n;
}
int main(){
    while(scanf("%lld",&n)!=EOF){
        ll l=8,r=1e16;
        ans=-1;
        while(l<=r){
            ll mid=(l+r)>>1;
            if(check(mid))r=mid-1;
            else l=mid+1;
        }
        printf("%lld\n",ans);
    }
}