Tópico
Título
Dê a você um x, pergunte se há x = a 3 + b 3 , envie SIM / NÃO
responda
- Observe que o intervalo de dados x é 1e12, então o intervalo de a, b é 1e4, enumere a, e então a dicotomia b, a condição de dicotomia é b 3 = x-a 3
- Claro, você também pode fazer isso com ponteiros duplos, apenas continue estreitando o intervalo.
Código 1 (dois pontos)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, x;
int main() {
cin >> t;
while (t--) {
cin >> x;
bool flag = false;
for (ll i = 1; i <= 10000; i++) {
if (i * i * i >= x) break;
ll res = x - i * i * i;
ll l = 1, r = 10000;
while (l < r) {
ll mid = (l + r) >> 1;
if (mid * mid * mid >= res) r=mid;
else l=mid+1;
}
if(l*l*l==res){
flag= true;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
Código 2 (ponteiro duplo)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, x;
int main() {
cin >> t;
while (t--) {
cin >> x;
bool flag = false;
for (ll i = 1, j = pow(x, 1.0 / 3)+9; i <= j; i++) {
while (i*i*i+j*j*j > x && j > 0) j--;
if (i*i*i+j*j*j == x && j != 0) {
flag = true;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}