C. Sum of Cubes

布满荆棘的人生 2022-11-08 11:27 238阅读 0赞

传送门
在这里插入图片描述
题目大意:
a 3 + b 3 = x a^3+b^3=x a3+b3=x,是否存在这样的 a a a和 b b b

题解:
(1)数据范围: 1 0 12 10^{12} 1012
(2) 想过用数组 a [ i ] = i ∗ i ∗ i ; b [ a [ i ] ] = t r u e ; a[i] = i * i * i;b[a[i]] = true; a[i]=i∗i∗i;b[a[i]]=true;来解决,但是数组的长度有限定,
size if array is not bigger than 1e9
(3)先暴力让 i i i 从1到 1 0 12 / 3 10^{12/3} 1012/3把存在数组中,b = n - a[i];用二分搜索在a[i]里面找到b。
(4)时间复杂度:n * logn

  1. #include <iostream>
  2. #define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
  3. using namespace std;
  4. typedef long long ll;
  5. const ll maxn = 1e4;
  6. ll a[maxn+5];
  7. //ll b[maxn]; size if array is not bigger than 1e9
  8. bool binary_search(ll key, ll a[], ll n)
  9. {
  10. ll low = 1;
  11. ll high = n;
  12. ll mid;
  13. while (low <= high)
  14. {
  15. mid = (low + high) / 2;
  16. if(key < a[mid])
  17. high = mid - 1;
  18. else if(key > a[mid])
  19. low = mid + 1;
  20. else if(key == a[mid])
  21. return true;
  22. }
  23. return false;
  24. }
  25. int main(){
  26. ios;
  27. for (ll i = 1; i <= maxn; i++)
  28. a[i] = i * i * i;
  29. int t;
  30. cin >> t;
  31. while( t-- ){
  32. ll n;
  33. cin >> n;
  34. bool flag = false;
  35. for (ll i = 1; i <= maxn; i++) {
  36. ll temp = n - a[i];
  37. if(!temp)
  38. {
  39. cout << "NO" << endl;
  40. flag = true;
  41. break;
  42. }
  43. else if(binary_search(temp, a, maxn))
  44. {
  45. cout << "YES" << endl;
  46. flag = true;
  47. break;
  48. }
  49. }
  50. if (!flag) cout << "NO" << endl;
  51. }
  52. return 0;
  53. }

发表评论

表情:
评论列表 (有 0 条评论,238人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Sum of Two Integers

    思路:在不使用运算符求和的问题中,最容易想到的一种方法是借助与、异或和移位操作符。与和移位操作符配合使用可以找到进位,异或操作符能够找到非进位,两者相加得到Sum,由于不允许使