题目:
要求:
让判断一个数是否能被两个三次幂的数相加。
分析:
题目给出的数据范围是1e12,结合示例提示,不妨就取10000打表~
然后是判断,暴力做是两个1e4数组,铁定会爆啦
那就用二分算法优化,但是我的二分很不熟,所以滚来写篇题解。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=5000+3;
#define ll long long
//
int n,m,k,t;
//
ll mm[10001];
int main(){
cin>>t;
for(ll i=1;i<10001;i++){//快乐打表
mm[i]=i*i*i;
}
while(t--){
ll x;
cin>>x;
int f=0;
for(int i=1;mm[i]<=x/2;i++){//前一半找不到后一半就肯定找不到了
ll t=x-mm[i];//另一半的值
int l=1,r=10000;//开始二分
while(l<r){
int mid=(l+r)/2;//中点~
if(mm[mid]<t)l=mid+1;//进入右边查找
else r=mid;//进入左边查找
}
//找到的时候应该是l==r的时候出来
if(mm[l]==t){
f=1;break;//标记找到
}
}
if(f)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}