题目描述
有不等式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); } }